Reasoning Details

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

Subgoal 1:

Variables: E2 Ty
PrA : |{expr}- nil Ty ~~> num 0
PrB : |{expr}- nil Ty ~~> E2
IsE : is_expr (nil Ty)
============================
 num 0 = E2
 < case PrB.

Subgoal 1:

Variables: Ty
PrA : |{expr}- nil Ty ~~> num 0
IsE : is_expr (nil Ty)
============================
 num 0 = num 0
 < search.

Subgoal 2:

Variables: E2 E4 E3
PrA : |{expr}- cons E3 E4 ~~> eq E3 E4
PrB : |{expr}- cons E3 E4 ~~> E2
IsE : is_expr (cons E3 E4)
============================
 eq E3 E4 = E2
 < case PrB.

Subgoal 2:

Variables: E4 E3
PrA : |{expr}- cons E3 E4 ~~> eq E3 E4
IsE : is_expr (cons E3 E4)
============================
 eq E3 E4 = eq E3 E4
 < search.

Subgoal 3:

Variables: E1 E2
PrA : |{expr}- null E1 ~~> E1
PrB : |{expr}- null E1 ~~> E2
IsE : is_expr (null E1)
============================
 E1 = E2
 < case PrB.

Subgoal 3:

Variables: E2
PrA : |{expr}- null E2 ~~> E2
IsE : is_expr (null E2)
============================
 E2 = E2
 < search.

Subgoal 4:

Variables: E1 E2
PrA : |{expr}- head E1 ~~> E1
PrB : |{expr}- head E1 ~~> E2
IsE : is_expr (head E1)
============================
 E1 = E2
 < case PrB.

Subgoal 4:

Variables: E2
PrA : |{expr}- head E2 ~~> E2
IsE : is_expr (head E2)
============================
 E2 = E2
 < search.

Subgoal 5:

Variables: E1 E2
PrA : |{expr}- tail E1 ~~> E1
PrB : |{expr}- tail E1 ~~> E2
IsE : is_expr (tail E1)
============================
 E1 = E2
 < case PrB.

Subgoal 5:

Variables: E2
PrA : |{expr}- tail E2 ~~> E2
IsE : is_expr (tail E2)
============================
 E2 = E2
 < search.

Subgoal 6:

Variables: E2 Index Lst
PrA : |{expr}- index Lst Index ~~> eq Lst Index
PrB : |{expr}- index Lst Index ~~> E2
IsE : is_expr (index Lst Index)
============================
 eq Lst Index = E2
 < case PrB.

Subgoal 6:

Variables: Index Lst
PrA : |{expr}- index Lst Index ~~> eq Lst Index
IsE : is_expr (index Lst Index)
============================
 eq Lst Index = eq Lst Index
 < search.

Subgoal 7:

Variables: E1 E2
PrA : |{expr}- looseEval:list:length E1 ~~> E1
PrB : |{expr}- looseEval:list:length E1 ~~> E2
IsE : is_expr (looseEval:list:length E1)
============================
 E1 = E2
 < case PrB.

Subgoal 7:

Variables: E2
PrA : |{expr}- looseEval:list:length E2 ~~> E2
IsE : is_expr (looseEval:list:length E2)
============================
 E2 = E2
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_expr_is.

Subgoal 1:

Variables: Ty
Pr : |{expr}- nil Ty ~~> num 0
IsE : is_expr (nil Ty)
============================
 is_expr (num 0)
 < search.

Subgoal 2:

Variables: E2 E1
Pr : |{expr}- cons E1 E2 ~~> eq E1 E2
IsE : is_expr (cons E1 E2)
============================
 is_expr (eq E1 E2)
 < case IsE.

Subgoal 2:

Variables: E2 E1
Pr : |{expr}- cons E1 E2 ~~> eq E1 E2
H1 : is_expr E1
H2 : is_expr E2
============================
 is_expr (eq E1 E2)
 < search.

Subgoal 3:

Variables: E'
Pr : |{expr}- null E' ~~> E'
IsE : is_expr (null E')
============================
 is_expr E'
 < case IsE.

Subgoal 3:

Variables: E'
Pr : |{expr}- null E' ~~> E'
H1 : is_expr E'
============================
 is_expr E'
 < search.

Subgoal 4:

Variables: E'
Pr : |{expr}- head E' ~~> E'
IsE : is_expr (head E')
============================
 is_expr E'
 < case IsE.

Subgoal 4:

Variables: E'
Pr : |{expr}- head E' ~~> E'
H1 : is_expr E'
============================
 is_expr E'
 < search.

Subgoal 5:

Variables: E'
Pr : |{expr}- tail E' ~~> E'
IsE : is_expr (tail E')
============================
 is_expr E'
 < case IsE.

Subgoal 5:

Variables: E'
Pr : |{expr}- tail E' ~~> E'
H1 : is_expr E'
============================
 is_expr E'
 < search.

Subgoal 6:

Variables: Index Lst
Pr : |{expr}- index Lst Index ~~> eq Lst Index
IsE : is_expr (index Lst Index)
============================
 is_expr (eq Lst Index)
 < case IsE.

Subgoal 6:

Variables: Index Lst
Pr : |{expr}- index Lst Index ~~> eq Lst Index
H1 : is_expr Lst
H2 : is_expr Index
============================
 is_expr (eq Lst Index)
 < search.

Subgoal 7:

Variables: E'
Pr : |{expr}- looseEval:list:length E' ~~> E'
IsE : is_expr (looseEval:list:length E')
============================
 is_expr E'
 < case IsE.

Subgoal 7:

Variables: E'
Pr : |{expr}- looseEval:list:length E' ~~> E'
H1 : is_expr E'
============================
 is_expr E'
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_stmt_unique.

Subgoal 1:

Variables: L1 L2 S2 Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
============================
 scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) = S2
 < PrB: case PrB.

Subgoal 1:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
============================
 scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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 (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold1 (cons (head (name L)) (name Hold1))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE1) (tail (name L)))) (while (not (null (name Hold1))) (seq (assign L (cons (head (name Hold1)) (name L))) (assign Hold1 (tail (name Hold1)))))))))))
 < assert forall X,
     mem X (L::L1) -> mem X (L::L2).

Subgoal 1.1:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
============================
 forall X, mem X (L::L1) -> mem X (L::L2)
 < intros M.

Subgoal 1.1:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
M : mem X (L::L1)
============================
 mem X (L::L2)
 < M: case M.

Subgoal 1.1.1:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
============================
 mem L (L::L2)
 < search.

Subgoal 1.1.2:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
M : mem X L1
============================
 mem X (L::L2)
 < apply Rel12 to M.

Subgoal 1.1.2:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
M : mem X L1
H1 : mem X L2
============================
 mem X (L::L2)
 < search.

Subgoal 1:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
H1 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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 (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold1 (cons (head (name L)) (name Hold1))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE1) (tail (name L)))) (while (not (null (name Hold1))) (seq (assign L (cons (head (name Hold1)) (name L))) (assign Hold1 (tail (name Hold1)))))))))))
 < assert forall X,
     mem X (L::L2) -> mem X (L::L1).

Subgoal 1.2:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
H1 : forall X, mem X (L::L1) -> mem X (L::L2)
============================
 forall X, mem X (L::L2) -> mem X (L::L1)
 < intros M.

Subgoal 1.2:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
H1 : forall X, mem X (L::L1) -> mem X (L::L2)
M : mem X (L::L2)
============================
 mem X (L::L1)
 < M: case M.

Subgoal 1.2.1:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
H1 : forall X, mem X (L::L1) -> mem X (L::L2)
============================
 mem L (L::L1)
 < search.

Subgoal 1.2.2:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
H1 : forall X, mem X (L::L1) -> mem X (L::L2)
M : mem X L2
============================
 mem X (L::L1)
 < apply Rel21 to M.

Subgoal 1.2.2:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
H1 : forall X, mem X (L::L1) -> mem X (L::L2)
M : mem X L2
H2 : mem X L1
============================
 mem X (L::L1)
 < search.

Subgoal 1:

Variables: L1 L2 Hold L SaveE SaveI E I Hold1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
H1 : forall X, mem X (L::L1) -> mem X (L::L2)
H2 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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 (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold1 (cons (head (name L)) (name Hold1))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE1) (tail (name L)))) (while (not (null (name Hold1))) (seq (assign L (cons (head (name Hold1)) (name L))) (assign Hold1 (tail (name Hold1)))))))))))
 < apply fresh_name_unique_mems to PrA1 PrB _ _.

Subgoal 1:

Variables: L1 L2 Hold L SaveE E I Hold1 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 (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
H1 : forall X, mem X (L::L1) -> mem X (L::L2)
H2 : forall X, mem X (L::L2) -> mem X (L::L1)
============================
 scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold (nil intTy)) (seq (while (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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 (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold1 (cons (head (name L)) (name Hold1))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE1) (tail (name L)))) (while (not (null (name Hold1))) (seq (assign L (cons (head (name Hold1)) (name L))) (assign Hold1 (tail (name Hold1)))))))))))
 < apply fresh_name_unique_mems to PrA2 PrB1 _ _.

Subgoal 1:

Variables: L1 L2 L SaveE E I Hold1 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 (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold1 (cons (head (name L)) (name Hold1))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold1))) (seq (assign L (cons (head (name Hold1)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
H1 : forall X, mem X (L::L1) -> mem X (L::L2)
H2 : forall X, mem X (L::L2) -> mem X (L::L1)
============================
 scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold1 (cons (head (name L)) (name Hold1))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold1))) (seq (assign L (cons (head (name Hold1)) (name L))) (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 (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold1 (cons (head (name L)) (name Hold1))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE1) (tail (name L)))) (while (not (null (name Hold1))) (seq (assign L (cons (head (name Hold1)) (name L))) (assign Hold1 (tail (name Hold1)))))))))))
 < apply fresh_name_unique_mems to PrA3 PrB2 _ _.

Subgoal 1:

Variables: L1 L2 L E I Hold1 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 (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold1 (cons (head (name L)) (name Hold1))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE1) (tail (name L)))) (while (not (null (name Hold1))) (seq (assign L (cons (head (name Hold1)) (name L))) (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
PrB : fresh_name "I" (L::L2) SaveI1
PrB1 : fresh_name "Hold" (L::L2) Hold1
PrB2 : fresh_name "E" (L::L2) SaveE1
H1 : forall X, mem X (L::L1) -> mem X (L::L2)
H2 : forall X, mem X (L::L2) -> mem X (L::L1)
============================
 scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold1 (cons (head (name L)) (name Hold1))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE1) (tail (name L)))) (while (not (null (name Hold1))) (seq (assign L (cons (head (name Hold1)) (name L))) (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 (greater (name SaveI1) (num 0)) (seq (assign SaveI1 (minus (name SaveI1) (num 1))) (seq (assign Hold1 (cons (head (name L)) (name Hold1))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE1) (tail (name L)))) (while (not (null (name Hold1))) (seq (assign L (cons (head (name Hold1)) (name L))) (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 looseEval:host:proj_stmt_is.

Subgoal 1:

Variables: L Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
============================
 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (assign Hold (tail (name Hold))))))))))))
 < case IsS.

Subgoal 1:

Variables: L Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (assign Hold (tail (name Hold))))))))))))
 < apply fresh_name_is to _ Pr1.

Subgoal 1:

Variables: L Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (assign Hold (tail (name Hold))))))))))))
 < apply fresh_name_is to _ Pr3.

Subgoal 1:

Variables: L Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (assign Hold (tail (name Hold))))))))))))
 < apply fresh_name_is to _ Pr2.

Subgoal 1.1:

Variables: L Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
============================
 is_string "Hold"
 < search 6.

Subgoal 1:

Variables: L Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
H4 : is_string SaveI
H5 : is_string SaveE
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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (assign Hold (tail (name Hold))))))))))))
 < search 20.

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 looseEval:host:proj_stmt_other.

Subgoal 1:

Variables: L L' Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
============================
 exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
 < case IsS.

Subgoal 1:

Variables: L L' Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
============================
 exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
 < IsL'+: assert is_list is_string (L1::L').

Subgoal 1:

Variables: L L' Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
IsL'+ : is_list is_string (L1::L')
============================
 exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
 < apply fresh_name_exists to _ IsL'+ with
     Base = "I".

Subgoal 1:

Variables: L L' Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
IsL'+ : 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 _ IsL'+ with
     Base = "Hold".

Subgoal 1.1:

Variables: L L' Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
IsL'+ : is_list is_string (L1::L')
H4 : fresh_name "I" (L1::L') F
============================
 is_string "Hold"
 < search 6.

Subgoal 1:

Variables: L L' Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
IsL'+ : 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 _ IsL'+ with
     Base = "E".

Subgoal 1:

Variables: L L' Hold 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L1)) (name Hold))) (assign L1 (tail (name L1)))))) (seq (assign L1 (cons (name SaveE) (tail (name L1)))) (while (not (null (name Hold))) (seq (assign L1 (cons (head (name Hold)) (name L1))) (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
H1 : is_string L1
H2 : is_expr I
H3 : is_expr E
IsL'+ : 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''
 < 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''
 < apply fresh_name_exists to _ _ with
     Base = "L" Names = X::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
H4 : fresh_name "L" (X::L') F
============================
 exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_fun_unique.

Proof completed.
 < Prove_Constraint looseEval:host:proj_fun_is.

Proof completed.
 < Prove_Constraint looseEval:host:proj_param_unique.

Proof completed.
 < Prove_Constraint looseEval:host:proj_param_is.

Proof completed.
 < Prove_Constraint looseEval:host:proj_program_unique.

Proof completed.
 < Prove_Constraint looseEval:host:proj_program_is.

Proof completed.
 < Prove_Constraint looseEval:host:proj_typ_unique.

Variables: T1 T2
PrA : |{typ}- listTy T1 ~~> T1
PrB : |{typ}- listTy T1 ~~> T2
IsT : is_typ (listTy T1)
============================
 T1 = T2
 < case PrB.

Variables: T2
PrA : |{typ}- listTy T2 ~~> T2
IsT : is_typ (listTy T2)
============================
 T2 = T2
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_typ_is.

Variables: T'
Pr : |{typ}- listTy T' ~~> T'
IsT : is_typ (listTy T')
============================
 is_typ T'
 < case IsT.

Variables: T'
Pr : |{typ}- listTy T' ~~> T'
H1 : is_typ T'
============================
 is_typ T'
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_value_unique.

Subgoal 1:

Variables: V2
PrA : |{value}- nilVal ~~> intVal 0
PrB : |{value}- nilVal ~~> V2
IsV : is_value nilVal
============================
 intVal 0 = V2
 < case PrB.

Subgoal 1:

PrA : |{value}- nilVal ~~> intVal 0
IsV : is_value nilVal
============================
 intVal 0 = intVal 0
 < search.

Subgoal 2:

Variables: V2 Tl Hd
PrA : |{value}- consVal Hd Tl ~~> recVal (consRecFieldVals "head" Hd (consRecFieldVals "tail" Tl nilRecFieldVals))
PrB : |{value}- consVal Hd Tl ~~> V2
IsV : is_value (consVal Hd Tl)
============================
 recVal (consRecFieldVals "head" Hd (consRecFieldVals "tail" Tl nilRecFieldVals)) = V2
 < case PrB.

Subgoal 2:

Variables: Tl Hd
PrA : |{value}- consVal Hd Tl ~~> recVal (consRecFieldVals "head" Hd (consRecFieldVals "tail" Tl nilRecFieldVals))
IsV : is_value (consVal Hd Tl)
============================
 recVal (consRecFieldVals "head" Hd (consRecFieldVals "tail" Tl nilRecFieldVals)) = recVal (consRecFieldVals "head" Hd (consRecFieldVals "tail" Tl nilRecFieldVals))
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_value_is.

Subgoal 1:

Pr : |{value}- nilVal ~~> intVal 0
IsV : is_value nilVal
============================
 is_value (intVal 0)
 < search.

Subgoal 2:

Variables: Tl Hd
Pr : |{value}- consVal Hd Tl ~~> recVal (consRecFieldVals "head" Hd (consRecFieldVals "tail" Tl nilRecFieldVals))
IsV : is_value (consVal Hd Tl)
============================
 is_value (recVal (consRecFieldVals "head" Hd (consRecFieldVals "tail" Tl nilRecFieldVals)))
 < case IsV.

Subgoal 2:

Variables: Tl Hd
Pr : |{value}- consVal Hd Tl ~~> recVal (consRecFieldVals "head" Hd (consRecFieldVals "tail" Tl nilRecFieldVals))
H1 : is_value Hd
H2 : is_value Tl
============================
 is_value (recVal (consRecFieldVals "head" Hd (consRecFieldVals "tail" Tl nilRecFieldVals)))
 < search 20.

Proof completed.
 < Add_Proj_Rel looseEval:host:is_expr,
   looseEval:host:is_args,
   looseEval:host:is_recFieldExprs.

Proof completed.
 < Prove_Ext_Ind looseEval:host:is_expr,
   looseEval:host:is_args,
   looseEval:host:is_recFieldExprs.

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

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
R : is_expr (nil Typ) @
R1 : is_typ Typ
============================
 <is_expr {P}> (nil Typ)
 < search.

Subgoal 1.21:

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

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

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

Subgoal 1.22:

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
R : is_expr (head Expr) @
R1 : is_expr Expr *
============================
 <is_expr {P}> (head Expr)
 < apply IH to R1.

Subgoal 1.22:

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
R : is_expr (head Expr) @
R1 : is_expr Expr *
H1 : <is_expr {P}> Expr
============================
 <is_expr {P}> (head Expr)
 < search.

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
R : is_expr (tail Expr) @
R1 : is_expr Expr *
============================
 <is_expr {P}> (tail 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
R : is_expr (tail Expr) @
R1 : is_expr Expr *
H1 : <is_expr {P}> Expr
============================
 <is_expr {P}> (tail Expr)
 < search.

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
R : is_expr (null Expr) @
R1 : is_expr Expr *
============================
 <is_expr {P}> (null 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
R : is_expr (null Expr) @
R1 : is_expr Expr *
H1 : <is_expr {P}> Expr
============================
 <is_expr {P}> (null Expr)
 < search.

Subgoal 1.25:

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

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

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

Subgoal 1.26:

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
R : is_expr (looseEval:list:length Expr) @
R1 : is_expr Expr *
============================
 <is_expr {P}> (looseEval:list:length Expr)
 < apply IH to R1.

Subgoal 1.26:

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
R : is_expr (looseEval:list:length Expr) @
R1 : is_expr Expr *
H1 : <is_expr {P}> Expr
============================
 <is_expr {P}> (looseEval:list:length Expr)
 < search.

Proof completed.
 < Add_Proj_Rel looseEval:host:is_stmt.

Proof completed.
 < Prove_Ext_Ind looseEval:host:is_stmt.

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

Variables: Expr Expr1 S1
IH : 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)
 < IsL: assert is_list is_string [S1].

Subgoal 10:

Variables: Expr Expr1 S1
IH : 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
IsL : is_list is_string [S1]
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < FrI: apply fresh_name_exists to _ IsL with
          Base = "I".

Subgoal 10:

Variables: Expr Expr1 S1 F
IH : 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
IsL : is_list is_string [S1]
FrI : fresh_name "I" [S1] F
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < FrH: apply fresh_name_exists to _ IsL with
          Base = "Hold".

Subgoal 10.1:

Variables: Expr Expr1 S1 F
IH : 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
IsL : is_list is_string [S1]
FrI : fresh_name "I" [S1] F
============================
 is_string "Hold"
 < search 6.

Subgoal 10:

Variables: Expr Expr1 S1 F F1
IH : 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
IsL : is_list is_string [S1]
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 _ IsL with
          Base = "E".

Subgoal 10:

Variables: Expr Expr1 S1 F F1 F2
IH : 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
IsL : is_list is_string [S1]
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)
 < apply fresh_name_is to _ FrI.

Subgoal 10:

Variables: Expr Expr1 S1 F F1 F2
IH : 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
IsL : is_list is_string [S1]
FrI : fresh_name "I" [S1] F
FrH : fresh_name "Hold" [S1] F1
FrE : fresh_name "E" [S1] F2
H1 : is_string F
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < apply fresh_name_is to _ FrE.

Subgoal 10:

Variables: Expr Expr1 S1 F F1 F2
IH : 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
IsL : is_list is_string [S1]
FrI : fresh_name "I" [S1] F
FrH : fresh_name "Hold" [S1] F1
FrE : fresh_name "E" [S1] F2
H1 : is_string F
H2 : is_string F2
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < apply fresh_name_is to _ FrH.

Subgoal 10.2:

Variables: Expr Expr1 S1 F F1 F2
IH : 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
IsL : is_list is_string [S1]
FrI : fresh_name "I" [S1] F
FrH : fresh_name "Hold" [S1] F1
FrE : fresh_name "E" [S1] F2
H1 : is_string F
H2 : is_string F2
============================
 is_string "Hold"
 < search 6.

Subgoal 10:

Variables: Expr Expr1 S1 F F1 F2
IH : 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
IsL : is_list is_string [S1]
FrI : fresh_name "I" [S1] F
FrH : fresh_name "Hold" [S1] F1
FrE : fresh_name "E" [S1] F2
H1 : is_string F
H2 : is_string F2
H3 : is_string F1
============================
 <is_stmt {P}> (listUpdate S1 Expr1 Expr)
 < search 15.

Subgoal 11:

Variables: Stmt Expr S1
IH : 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)
 < Fr: apply fresh_name_exists to _ _ with
         Base = "L" Names = [S1].

Subgoal 11:

Variables: Stmt Expr S1 F
IH : 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 *
Fr : fresh_name "L" [S1] F
============================
 <is_stmt {P}> (listForeach S1 Expr Stmt)
 < apply fresh_name_is to _ Fr.

Subgoal 11:

Variables: Stmt Expr S1 F
IH : 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 *
Fr : fresh_name "L" [S1] F
H1 : is_string F
============================
 <is_stmt {P}> (listForeach S1 Expr Stmt)
 < R: case R.

Subgoal 11:

Variables: Stmt Expr S1 F
IH : forall S, is_stmt S * -> <is_stmt {P}> S
R1 : is_string S1
R2 : is_expr Expr
R3 : is_stmt Stmt *
Fr : fresh_name "L" [S1] F
H1 : is_string F
R : is_string S1
R4 : is_expr Expr
R5 : is_stmt Stmt *
============================
 <is_stmt {P}> (listForeach S1 Expr Stmt)
 < apply IH to R5.

Subgoal 11:

Variables: Stmt Expr S1 F
IH : forall S, is_stmt S * -> <is_stmt {P}> S
R1 : is_string S1
R2 : is_expr Expr
R3 : is_stmt Stmt *
Fr : fresh_name "L" [S1] F
H1 : is_string F
R : is_string S1
R4 : is_expr Expr
R5 : is_stmt Stmt *
H2 : <is_stmt {P}> Stmt
============================
 <is_stmt {P}> (listForeach S1 Expr Stmt)
 < search 10.

Proof completed.
 < Prove looseEval:host:is_args_nilArgs_or_consArgs.

Proof completed.
 < Prove looseEval:host:is_recFieldExprs_nilRecFieldExprs_or_consRecFieldExprs.

Proof completed.
 < Add_Proj_Rel looseEval:host:is_value,
   looseEval:host:is_recFieldVals.

Proof completed.
 < Prove_Ext_Ind looseEval:host:is_value,
   looseEval:host:is_recFieldVals.

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

IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_value nilVal @
============================
 <is_value {P}> nilVal
 < search.

Subgoal 1.7:

Variables: Value Value1
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_value (consVal Value1 Value) @
R1 : is_value Value1 *
R2 : is_value Value *
============================
 <is_value {P}> (consVal Value1 Value)
 < apply IH to R1.

Subgoal 1.7:

Variables: Value Value1
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_value (consVal Value1 Value) @
R1 : is_value Value1 *
R2 : is_value Value *
H1 : <is_value {P}> Value1
============================
 <is_value {P}> (consVal Value1 Value)
 < apply IH to R2.

Subgoal 1.7:

Variables: Value Value1
IH : forall V, is_value V * -> <is_value {P}> V
IH1 : forall RFVs, is_recFieldVals RFVs * -> <is_recFieldVals {P}> RFVs
R : is_value (consVal Value1 Value) @
R1 : is_value Value1 *
R2 : is_value Value *
H1 : <is_value {P}> Value1
H2 : <is_value {P}> Value
============================
 <is_value {P}> (consVal Value1 Value)
 < search 10.

Proof completed.
 < Prove looseEval:host:is_value_intVal_or_not.

Subgoal 6:

IH : forall V,
       is_value V * -> (exists I, intVal I = V) \/
       ((exists I, intVal I = V) -> false)
IsV : is_value nilVal @
============================
 (exists I, intVal I = nilVal) \/ ((exists I, intVal I = nilVal) -> false)
 < search.

Subgoal 7:

Variables: Value Value1
IH : forall V,
       is_value V * -> (exists I, intVal I = V) \/
       ((exists I, intVal I = V) -> false)
IsV : is_value (consVal Value1 Value) @
IsV1 : is_value Value1 *
IsV2 : is_value Value *
============================
 (exists I, intVal I = consVal Value1 Value) \/
 ((exists I, intVal I = consVal Value1 Value) -> false)
 < search.

Proof completed.
 < Prove looseEval:host:is_value_trueVal_or_not.

Subgoal 6:

IH : forall V, is_value V * -> trueVal = V \/ (trueVal = V -> false)
IsV : is_value nilVal @
============================
 trueVal = nilVal \/ (trueVal = nilVal -> false)
 < search.

Subgoal 7:

Variables: Value Value1
IH : forall V, is_value V * -> trueVal = V \/ (trueVal = V -> false)
IsV : is_value (consVal Value1 Value) @
IsV1 : is_value Value1 *
IsV2 : is_value Value *
============================
 trueVal = consVal Value1 Value \/ (trueVal = consVal Value1 Value -> false)
 < search.

Proof completed.
 < Prove looseEval:host:is_value_falseVal_or_not.

Subgoal 6:

IH : forall V, is_value V * -> falseVal = V \/ (falseVal = V -> false)
IsV : is_value nilVal @
============================
 falseVal = nilVal \/ (falseVal = nilVal -> false)
 < search.

Subgoal 7:

Variables: Value Value1
IH : forall V, is_value V * -> falseVal = V \/ (falseVal = V -> false)
IsV : is_value (consVal Value1 Value) @
IsV1 : is_value Value1 *
IsV2 : is_value Value *
============================
 falseVal = consVal Value1 Value \/ (falseVal = consVal Value1 Value -> false)
 < search.

Proof completed.
 < Prove looseEval:host:is_value_stringVal_or_not.

Subgoal 6:

IH : forall V,
       is_value V * -> (exists S, stringVal S = V) \/
       ((exists S, stringVal S = V) -> false)
IsV : is_value nilVal @
============================
 (exists S, stringVal S = nilVal) \/ ((exists S, stringVal S = nilVal) -> false)
 < search.

Subgoal 7:

Variables: Value Value1
IH : forall V,
       is_value V * -> (exists S, stringVal S = V) \/
       ((exists S, stringVal S = V) -> false)
IsV : is_value (consVal Value1 Value) @
IsV1 : is_value Value1 *
IsV2 : is_value Value *
============================
 (exists S, stringVal S = consVal Value1 Value) \/
 ((exists S, stringVal S = consVal Value1 Value) -> false)
 < search.

Proof completed.
 < Prove looseEval:host:is_value_recVal_or_not.

Subgoal 6:

IH : forall V,
       is_value V * -> (exists Fs, recVal Fs = V) \/
       ((exists Fs, recVal Fs = V) -> false)
IsV : is_value nilVal @
============================
 (exists Fs, recVal Fs = nilVal) \/ ((exists Fs, recVal Fs = nilVal) -> false)
 < search.

Subgoal 7:

Variables: Value Value1
IH : forall V,
       is_value V * -> (exists Fs, recVal Fs = V) \/
       ((exists Fs, recVal Fs = V) -> false)
IsV : is_value (consVal Value1 Value) @
IsV1 : is_value Value1 *
IsV2 : is_value Value *
============================
 (exists Fs, recVal Fs = consVal Value1 Value) \/
 ((exists Fs, recVal Fs = consVal Value1 Value) -> false)
 < search.

Proof completed.
 < Extensible_Theorem
      is_value_nilVal_or_not : forall V,
         IsV : is_value V ->
         nilVal = V \/
         (nilVal = V -> false)
      on IsV.

Subgoal 1:

Variables: I
IH : forall V, is_value V * -> nilVal = V \/ (nilVal = V -> false)
IsV : is_value (intVal I) @
IsV1 : is_integer I
============================
 nilVal = intVal I \/ (nilVal = intVal I -> false)
 < search.

Subgoal 2:

IH : forall V, is_value V * -> nilVal = V \/ (nilVal = V -> false)
IsV : is_value trueVal @
============================
 nilVal = trueVal \/ (nilVal = trueVal -> false)
 < search.

Subgoal 3:

IH : forall V, is_value V * -> nilVal = V \/ (nilVal = V -> false)
IsV : is_value falseVal @
============================
 nilVal = falseVal \/ (nilVal = falseVal -> false)
 < search.

Subgoal 4:

Variables: S
IH : forall V, is_value V * -> nilVal = V \/ (nilVal = V -> false)
IsV : is_value (stringVal S) @
IsV1 : is_string S
============================
 nilVal = stringVal S \/ (nilVal = stringVal S -> false)
 < search.

Subgoal 5:

Variables: RecFieldVals
IH : forall V, is_value V * -> nilVal = V \/ (nilVal = V -> false)
IsV : is_value (recVal RecFieldVals) @
IsV1 : is_recFieldVals RecFieldVals *
============================
 nilVal = recVal RecFieldVals \/ (nilVal = recVal RecFieldVals -> false)
 < search.

Subgoal 6:

IH : forall V, is_value V * -> nilVal = V \/ (nilVal = V -> false)
IsV : is_value nilVal @
============================
 nilVal = nilVal \/ (nilVal = nilVal -> false)
 < search.

Subgoal 7:

Variables: Value Value1
IH : forall V, is_value V * -> nilVal = V \/ (nilVal = V -> false)
IsV : is_value (consVal Value1 Value) @
IsV1 : is_value Value1 *
IsV2 : is_value Value *
============================
 nilVal = consVal Value1 Value \/ (nilVal = consVal Value1 Value -> false)
 < search.

Subgoal 8:

Variables: X_T
IH : forall V, is_value V * -> nilVal = V \/ (nilVal = V -> false)
IsV : is_value <unknown K is_value> @
IsV1 : |{value}- <unknown K is_value> ~~> X_T
IsV2 : is_value X_T *
============================
 nilVal = <unknown K is_value> \/ (nilVal = <unknown K is_value> -> false)
 < search.

Proof completed.
 < Extensible_Theorem
      is_value_consVal_or_not : forall V,
         IsV : is_value V ->
         (exists V1 V2, consVal V1 V2 = V) \/
         ((exists V1 V2, consVal V1 V2 = V) -> false)
      on IsV.

Subgoal 1:

Variables: I
IH : forall V,
       is_value V * -> (exists V1 V2, consVal V1 V2 = V) \/
       ((exists V1 V2, consVal V1 V2 = V) -> false)
IsV : is_value (intVal I) @
IsV1 : is_integer I
============================
 (exists V1 V2, consVal V1 V2 = intVal I) \/
 ((exists V1 V2, consVal V1 V2 = intVal I) -> false)
 < search.

Subgoal 2:

IH : forall V,
       is_value V * -> (exists V1 V2, consVal V1 V2 = V) \/
       ((exists V1 V2, consVal V1 V2 = V) -> false)
IsV : is_value trueVal @
============================
 (exists V1 V2, consVal V1 V2 = trueVal) \/
 ((exists V1 V2, consVal V1 V2 = trueVal) -> false)
 < search.

Subgoal 3:

IH : forall V,
       is_value V * -> (exists V1 V2, consVal V1 V2 = V) \/
       ((exists V1 V2, consVal V1 V2 = V) -> false)
IsV : is_value falseVal @
============================
 (exists V1 V2, consVal V1 V2 = falseVal) \/
 ((exists V1 V2, consVal V1 V2 = falseVal) -> false)
 < search.

Subgoal 4:

Variables: S
IH : forall V,
       is_value V * -> (exists V1 V2, consVal V1 V2 = V) \/
       ((exists V1 V2, consVal V1 V2 = V) -> false)
IsV : is_value (stringVal S) @
IsV1 : is_string S
============================
 (exists V1 V2, consVal V1 V2 = stringVal S) \/
 ((exists V1 V2, consVal V1 V2 = stringVal S) -> false)
 < search.

Subgoal 5:

Variables: RecFieldVals
IH : forall V,
       is_value V * -> (exists V1 V2, consVal V1 V2 = V) \/
       ((exists V1 V2, consVal V1 V2 = V) -> false)
IsV : is_value (recVal RecFieldVals) @
IsV1 : is_recFieldVals RecFieldVals *
============================
 (exists V1 V2, consVal V1 V2 = recVal RecFieldVals) \/
 ((exists V1 V2, consVal V1 V2 = recVal RecFieldVals) -> false)
 < search.

Subgoal 6:

IH : forall V,
       is_value V * -> (exists V1 V2, consVal V1 V2 = V) \/
       ((exists V1 V2, consVal V1 V2 = V) -> false)
IsV : is_value nilVal @
============================
 (exists V1 V2, consVal V1 V2 = nilVal) \/
 ((exists V1 V2, consVal V1 V2 = nilVal) -> false)
 < search.

Subgoal 7:

Variables: Value Value1
IH : forall V,
       is_value V * -> (exists V1 V2, consVal V1 V2 = V) \/
       ((exists V1 V2, consVal V1 V2 = V) -> false)
IsV : is_value (consVal Value1 Value) @
IsV1 : is_value Value1 *
IsV2 : is_value Value *
============================
 (exists V1 V2, consVal V1 V2 = consVal Value1 Value) \/
 ((exists V1 V2, consVal V1 V2 = consVal Value1 Value) -> false)
 < search.

Subgoal 8:

Variables: X_T
IH : forall V,
       is_value V * -> (exists V1 V2, consVal V1 V2 = V) \/
       ((exists V1 V2, consVal V1 V2 = V) -> false)
IsV : is_value <unknown K is_value> @
IsV1 : |{value}- <unknown K is_value> ~~> X_T
IsV2 : is_value X_T *
============================
 (exists V1 V2, consVal V1 V2 = <unknown K is_value>) \/
 ((exists V1 V2, consVal V1 V2 = <unknown K is_value>) -> false)
 < search.

Proof completed.
 < Prove looseEval:host:is_recFieldVals_nil_or_cons.

Proof completed.
 < Prove looseEval:host:is_value_eq_or_not,
         looseEval:host:is_recFieldVals_eq_or_not.

Subgoal 1.6:

Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value nilVal @
Is2 : is_value V2
============================
 nilVal = V2 \/ (nilVal = V2 -> false)
 < Or: apply is_value_nilVal_or_not to Is2.

Subgoal 1.6:

Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value nilVal @
Is2 : is_value V2
Or : nilVal = V2 \/ (nilVal = V2 -> false)
============================
 nilVal = V2 \/ (nilVal = V2 -> false)
 < N: case Or.

Subgoal 1.6.1:

IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value nilVal @
Is2 : is_value nilVal
============================
 nilVal = nilVal \/ (nilVal = nilVal -> false)
 < search.

Subgoal 1.6.2:

Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value nilVal @
Is2 : is_value V2
N : nilVal = V2 -> false
============================
 nilVal = V2 \/ (nilVal = V2 -> false)
 < right.

Subgoal 1.6.2:

Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value nilVal @
Is2 : is_value V2
N : nilVal = V2 -> false
============================
 nilVal = V2 -> false
 < intros E.

Subgoal 1.6.2:

Variables: V2
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value nilVal @
Is2 : is_value V2
N : nilVal = V2 -> false
E : nilVal = V2
============================
 false
 < case E.

Subgoal 1.6.2:

IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value nilVal @
Is2 : is_value nilVal
N : nilVal = nilVal -> false
============================
 false
 < backchain N.

Subgoal 1.7:

Variables: V2 Value Value1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is2 : is_value V2
Is3 : is_value Value1 *
Is4 : is_value Value *
============================
 consVal Value1 Value = V2 \/ (consVal Value1 Value = V2 -> false)
 < Or: apply is_value_consVal_or_not to Is2.

Subgoal 1.7:

Variables: V2 Value Value1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is2 : is_value V2
Is3 : is_value Value1 *
Is4 : is_value Value *
Or : (exists V1 V3, consVal V1 V3 = V2) \/
     ((exists V1 V3, consVal V1 V3 = V2) -> false)
============================
 consVal Value1 Value = V2 \/ (consVal Value1 Value = V2 -> false)
 < N: case Or.

Subgoal 1.7.1:

Variables: Value Value1 V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is2 : is_value (consVal V3 V4)
Is3 : is_value Value1 *
Is4 : is_value Value *
============================
 consVal Value1 Value = consVal V3 V4 \/
 (consVal Value1 Value = consVal V3 V4 -> false)
 < Is': case Is2.

Subgoal 1.7.1:

Variables: Value Value1 V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is3 : is_value Value1 *
Is4 : is_value Value *
Is' : is_value V3
Is'1 : is_value V4
============================
 consVal Value1 Value = consVal V3 V4 \/
 (consVal Value1 Value = consVal V3 V4 -> false)
 < Or: apply IH to Is3 Is'.

Subgoal 1.7.1:

Variables: Value Value1 V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is3 : is_value Value1 *
Is4 : is_value Value *
Is' : is_value V3
Is'1 : is_value V4
Or : Value1 = V3 \/ (Value1 = V3 -> false)
============================
 consVal Value1 Value = consVal V3 V4 \/
 (consVal Value1 Value = consVal V3 V4 -> false)
 < N: case Or.

Subgoal 1.7.1.1:

Variables: Value V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal V3 Value) @
Is3 : is_value V3 *
Is4 : is_value Value *
Is' : is_value V3
Is'1 : is_value V4
============================
 consVal V3 Value = consVal V3 V4 \/ (consVal V3 Value = consVal V3 V4 -> false)
 < Or: apply IH to Is4 Is'1.

Subgoal 1.7.1.1:

Variables: Value V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal V3 Value) @
Is3 : is_value V3 *
Is4 : is_value Value *
Is' : is_value V3
Is'1 : is_value V4
Or : Value = V4 \/ (Value = V4 -> false)
============================
 consVal V3 Value = consVal V3 V4 \/ (consVal V3 Value = consVal V3 V4 -> false)
 < N: case Or.

Subgoal 1.7.1.1.1:

Variables: V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal V3 V4) @
Is3 : is_value V3 *
Is4 : is_value V4 *
Is' : is_value V3
Is'1 : is_value V4
============================
 consVal V3 V4 = consVal V3 V4 \/ (consVal V3 V4 = consVal V3 V4 -> false)
 < search.

Subgoal 1.7.1.1.2:

Variables: Value V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal V3 Value) @
Is3 : is_value V3 *
Is4 : is_value Value *
Is' : is_value V3
Is'1 : is_value V4
N : Value = V4 -> false
============================
 consVal V3 Value = consVal V3 V4 \/ (consVal V3 Value = consVal V3 V4 -> false)
 < right.

Subgoal 1.7.1.1.2:

Variables: Value V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal V3 Value) @
Is3 : is_value V3 *
Is4 : is_value Value *
Is' : is_value V3
Is'1 : is_value V4
N : Value = V4 -> false
============================
 consVal V3 Value = consVal V3 V4 -> false
 < intros E.

Subgoal 1.7.1.1.2:

Variables: Value V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal V3 Value) @
Is3 : is_value V3 *
Is4 : is_value Value *
Is' : is_value V3
Is'1 : is_value V4
N : Value = V4 -> false
E : consVal V3 Value = consVal V3 V4
============================
 false
 < case E.

Subgoal 1.7.1.1.2:

Variables: V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal V3 V4) @
Is3 : is_value V3 *
Is4 : is_value V4 *
Is' : is_value V3
Is'1 : is_value V4
N : V4 = V4 -> false
============================
 false
 < backchain N.

Subgoal 1.7.1.2:

Variables: Value Value1 V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is3 : is_value Value1 *
Is4 : is_value Value *
Is' : is_value V3
Is'1 : is_value V4
N : Value1 = V3 -> false
============================
 consVal Value1 Value = consVal V3 V4 \/
 (consVal Value1 Value = consVal V3 V4 -> false)
 < right.

Subgoal 1.7.1.2:

Variables: Value Value1 V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is3 : is_value Value1 *
Is4 : is_value Value *
Is' : is_value V3
Is'1 : is_value V4
N : Value1 = V3 -> false
============================
 consVal Value1 Value = consVal V3 V4 -> false
 < intros E.

Subgoal 1.7.1.2:

Variables: Value Value1 V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is3 : is_value Value1 *
Is4 : is_value Value *
Is' : is_value V3
Is'1 : is_value V4
N : Value1 = V3 -> false
E : consVal Value1 Value = consVal V3 V4
============================
 false
 < case E.

Subgoal 1.7.1.2:

Variables: V3 V4
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal V3 V4) @
Is3 : is_value V3 *
Is4 : is_value V4 *
Is' : is_value V3
Is'1 : is_value V4
N : V3 = V3 -> false
============================
 false
 < backchain N.

Subgoal 1.7.2:

Variables: V2 Value Value1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is2 : is_value V2
Is3 : is_value Value1 *
Is4 : is_value Value *
N : (exists V1 V3, consVal V1 V3 = V2) -> false
============================
 consVal Value1 Value = V2 \/ (consVal Value1 Value = V2 -> false)
 < right.

Subgoal 1.7.2:

Variables: V2 Value Value1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is2 : is_value V2
Is3 : is_value Value1 *
Is4 : is_value Value *
N : (exists V1 V3, consVal V1 V3 = V2) -> false
============================
 consVal Value1 Value = V2 -> false
 < intros E.

Subgoal 1.7.2:

Variables: V2 Value Value1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is2 : is_value V2
Is3 : is_value Value1 *
Is4 : is_value Value *
N : (exists V1 V3, consVal V1 V3 = V2) -> false
E : consVal Value1 Value = V2
============================
 false
 < case E.

Subgoal 1.7.2:

Variables: Value Value1
IH : forall V1 V2, is_value V1 * -> is_value V2 -> V1 = V2 \/ (V1 = V2 -> false)
IH1 : forall RFVs1 RFVs2,
        is_recFieldVals RFVs1 * -> is_recFieldVals RFVs2 -> RFVs1 = RFVs2 \/
        (RFVs1 = RFVs2 -> false)
Is1 : is_value (consVal Value1 Value) @
Is2 : is_value (consVal Value1 Value)
Is3 : is_value Value1 *
Is4 : is_value Value *
N : (exists V1 V3, consVal V1 V3 = consVal Value1 Value) -> false
============================
 false
 < backchain N.

Proof completed.
 < Prove looseEval:host:vars_unique.

Subgoal 1.20:

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

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

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

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

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

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

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

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

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

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

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

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.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 (tail E1)
VarsA : vars (tail E1) V1 @
VarsB : vars (tail 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 (tail E1) V1 @
VarsB : vars (tail 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 (tail 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 (tail 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 (null E1)
VarsA : vars (null E1) V1 @
VarsB : vars (null 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 (null E1) V1 @
VarsB : vars (null 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 (null 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 (null E1) V2 @
VarsA1 : vars E1 V2 *
H1 : is_expr E1
VarsB : vars E1 V2
============================
 V2 = V2
 < search.

Subgoal 1.25:

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

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

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

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

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

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

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 (looseEval:list:length E1)
VarsA : vars (looseEval:list:length E1) V1 @
VarsB : vars (looseEval:list:length E1) V2
VarsA1 : vars E1 V1 *
============================
 V1 = V2
 < case IsE.

Subgoal 1.26:

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 (looseEval:list:length E1) V1 @
VarsB : vars (looseEval:list:length E1) V2
VarsA1 : vars E1 V1 *
H1 : is_expr E1
============================
 V1 = V2
 < VarsB: case VarsB.

Subgoal 1.26:

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 (looseEval: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.26:

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 (looseEval:list:length E1) V2 @
VarsA1 : vars E1 V2 *
H1 : is_expr E1
VarsB : vars E1 V2
============================
 V2 = V2
 < search.

Proof completed.
 < Prove looseEval:host:vars_is.

Subgoal 1.20:

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

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

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

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

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

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

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

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

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.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 (tail E1)
V : vars (tail 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 (tail 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 (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.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 (null E1)
V : vars (null 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 (null 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 (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.25:

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

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

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

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

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

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 (looseEval:list:length E1)
V : vars (looseEval:list:length E1) V @
V1 : vars E1 V *
============================
 is_list is_string V
 < case IsE.

Subgoal 1.26:

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 (looseEval:list:length E1) V @
V1 : vars E1 V *
H1 : is_expr E1
============================
 is_list is_string V
 < apply IH to _ V1.

Subgoal 1.26:

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 (looseEval: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 looseEval:host:vars_exist,
         looseEval:host:varsArgs_exist,
         looseEval:host:varsRecFields_exist.

Subgoal 1.20:

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

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

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

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
 < Is1: apply vars_is to _ V1.

Subgoal 1.21:

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
Is1 : is_list is_string V
============================
 exists V, vars (cons Expr1 Expr) V
 < Is2: apply vars_is to _ V2.

Subgoal 1.21:

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
Is1 : is_list is_string V
Is2 : is_list is_string V1
============================
 exists V, vars (cons Expr1 Expr) V
 < apply append_list_string_total to Is1 Is2.

Subgoal 1.21:

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
Is1 : is_list is_string V
Is2 : is_list is_string V1
H1 : V ++ V1 = L3
============================
 exists V, vars (cons Expr1 Expr) V
 < search.

Subgoal 1.22:

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

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.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 (tail Expr) @
IsE1 : is_expr Expr *
============================
 exists V, vars (tail 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 (tail Expr) @
IsE1 : is_expr Expr *
H1 : vars Expr V
============================
 exists V, vars (tail 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 (null Expr) @
IsE1 : is_expr Expr *
============================
 exists V, vars (null 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 (null Expr) @
IsE1 : is_expr Expr *
H1 : vars Expr V
============================
 exists V, vars (null Expr) V
 < search.

Subgoal 1.25:

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

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

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
 < Is1: apply vars_is to _ V1.

Subgoal 1.25:

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
Is1 : is_list is_string V
============================
 exists V, vars (index Expr1 Expr) V
 < Is2: apply vars_is to _ V2.

Subgoal 1.25:

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
Is1 : is_list is_string V
Is2 : is_list is_string V1
============================
 exists V, vars (index Expr1 Expr) V
 < apply append_list_string_total to Is1 Is2.

Subgoal 1.25:

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
Is1 : is_list is_string V
Is2 : is_list is_string V1
H1 : V ++ V1 = L3
============================
 exists V, vars (index Expr1 Expr) V
 < search.

Subgoal 1.26:

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 (looseEval:list:length Expr) @
IsE1 : is_expr Expr *
============================
 exists V, vars (looseEval:list:length Expr) V
 < apply IH to IsE1.

Subgoal 1.26:

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 (looseEval:list:length Expr) @
IsE1 : is_expr Expr *
H1 : vars Expr V
============================
 exists V, vars (looseEval:list:length Expr) V
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_vars.

Subgoal 1:

Variables: V V_P X Ty
Pr : |{expr}- nil Ty ~~> num 0
IsE : is_expr (nil Ty)
V : vars (nil Ty) V
V_P : vars (num 0) V_P
Mem : mem X V
============================
 mem X V_P
 < case V.

Subgoal 1:

Variables: V_P X Ty
Pr : |{expr}- nil Ty ~~> num 0
IsE : is_expr (nil Ty)
V_P : vars (num 0) V_P
Mem : mem X []
============================
 mem X V_P
 < case Mem.

Subgoal 2:

Variables: V V_P X E2 E1
Pr : |{expr}- cons E1 E2 ~~> eq E1 E2
IsE : is_expr (cons E1 E2)
V : vars (cons E1 E2) V
V_P : vars (eq E1 E2) V_P
Mem : mem X V
============================
 mem X V_P
 < case IsE.

Subgoal 2:

Variables: V V_P X E2 E1
Pr : |{expr}- cons E1 E2 ~~> eq E1 E2
V : vars (cons E1 E2) V
V_P : vars (eq E1 E2) V_P
Mem : mem X V
H1 : is_expr E1
H2 : is_expr E2
============================
 mem X V_P
 < V: case V.

Subgoal 2:

Variables: V V_P X E2 E1 V2 V3
Pr : |{expr}- cons E1 E2 ~~> eq E1 E2
V_P : vars (eq E1 E2) V_P
Mem : mem X V
H1 : is_expr E1
H2 : is_expr E2
V : vars E1 V2
V1 : vars E2 V3
V2 : V2 ++ V3 = V
============================
 mem X V_P
 < V_P: case V_P.

Subgoal 2:

Variables: V V_P X E2 E1 V2 V3 V1 V4
Pr : |{expr}- cons E1 E2 ~~> eq E1 E2
Mem : mem X V
H1 : is_expr E1
H2 : is_expr E2
V : vars E1 V2
V1 : vars E2 V3
V2 : V2 ++ V3 = V
V_P : vars E1 V1
V_P1 : vars E2 V4
V_P2 : V1 ++ V4 = V_P
============================
 mem X V_P
 < apply vars_unique to _ V V_P.

Subgoal 2:

Variables: V V_P X E2 E1 V3 V1 V4
Pr : |{expr}- cons E1 E2 ~~> eq E1 E2
Mem : mem X V
H1 : is_expr E1
H2 : is_expr E2
V : vars E1 V1
V1 : vars E2 V3
V2 : V1 ++ V3 = V
V_P : vars E1 V1
V_P1 : vars E2 V4
V_P2 : V1 ++ V4 = V_P
============================
 mem X V_P
 < apply vars_unique to _ V1 V_P1.

Subgoal 2:

Variables: V V_P X E2 E1 V1 V4
Pr : |{expr}- cons E1 E2 ~~> eq E1 E2
Mem : mem X V
H1 : is_expr E1
H2 : is_expr E2
V : vars E1 V1
V1 : vars E2 V4
V2 : V1 ++ V4 = V
V_P : vars E1 V1
V_P1 : vars E2 V4
V_P2 : V1 ++ V4 = V_P
============================
 mem X V_P
 < apply append_unique to V_P2 V2.

Subgoal 2:

Variables: V X E2 E1 V1 V4
Pr : |{expr}- cons E1 E2 ~~> eq E1 E2
Mem : mem X V
H1 : is_expr E1
H2 : is_expr E2
V : vars E1 V1
V1 : vars E2 V4
V2 : V1 ++ V4 = V
V_P : vars E1 V1
V_P1 : vars E2 V4
V_P2 : V1 ++ V4 = V
============================
 mem X V
 < search.

Subgoal 3:

Variables: E_P V V_P X
Pr : |{expr}- null E_P ~~> E_P
IsE : is_expr (null E_P)
V : vars (null E_P) V
V_P : vars E_P V_P
Mem : mem X V
============================
 mem X V_P
 < case IsE.

Subgoal 3:

Variables: E_P V V_P X
Pr : |{expr}- null E_P ~~> E_P
V : vars (null E_P) V
V_P : vars E_P V_P
Mem : mem X V
H1 : is_expr E_P
============================
 mem X V_P
 < V: case V.

Subgoal 3:

Variables: E_P V V_P X
Pr : |{expr}- null E_P ~~> E_P
V_P : vars E_P V_P
Mem : mem X V
H1 : is_expr E_P
V : vars E_P V
============================
 mem X V_P
 < apply vars_unique to _ V_P V.

Subgoal 3:

Variables: E_P V X
Pr : |{expr}- null E_P ~~> E_P
V_P : vars E_P V
Mem : mem X V
H1 : is_expr E_P
V : vars E_P V
============================
 mem X V
 < search.

Subgoal 4:

Variables: E_P V V_P X
Pr : |{expr}- head E_P ~~> E_P
IsE : is_expr (head E_P)
V : vars (head E_P) V
V_P : vars E_P V_P
Mem : mem X V
============================
 mem X V_P
 < case IsE.

Subgoal 4:

Variables: E_P V V_P X
Pr : |{expr}- head E_P ~~> E_P
V : vars (head E_P) V
V_P : vars E_P V_P
Mem : mem X V
H1 : is_expr E_P
============================
 mem X V_P
 < V: case V.

Subgoal 4:

Variables: E_P V V_P X
Pr : |{expr}- head E_P ~~> E_P
V_P : vars E_P V_P
Mem : mem X V
H1 : is_expr E_P
V : vars E_P V
============================
 mem X V_P
 < apply vars_unique to _ V_P V.

Subgoal 4:

Variables: E_P V X
Pr : |{expr}- head E_P ~~> E_P
V_P : vars E_P V
Mem : mem X V
H1 : is_expr E_P
V : vars E_P V
============================
 mem X V
 < search.

Subgoal 5:

Variables: E_P V V_P X
Pr : |{expr}- tail E_P ~~> E_P
IsE : is_expr (tail E_P)
V : vars (tail E_P) V
V_P : vars E_P V_P
Mem : mem X V
============================
 mem X V_P
 < case IsE.

Subgoal 5:

Variables: E_P V V_P X
Pr : |{expr}- tail E_P ~~> E_P
V : vars (tail E_P) V
V_P : vars E_P V_P
Mem : mem X V
H1 : is_expr E_P
============================
 mem X V_P
 < V: case V.

Subgoal 5:

Variables: E_P V V_P X
Pr : |{expr}- tail E_P ~~> E_P
V_P : vars E_P V_P
Mem : mem X V
H1 : is_expr E_P
V : vars E_P V
============================
 mem X V_P
 < apply vars_unique to _ V_P V.

Subgoal 5:

Variables: E_P V X
Pr : |{expr}- tail E_P ~~> E_P
V_P : vars E_P V
Mem : mem X V
H1 : is_expr E_P
V : vars E_P V
============================
 mem X V
 < search.

Subgoal 6:

Variables: V V_P X Index Lst
Pr : |{expr}- index Lst Index ~~> eq Lst Index
IsE : is_expr (index Lst Index)
V : vars (index Lst Index) V
V_P : vars (eq Lst Index) V_P
Mem : mem X V
============================
 mem X V_P
 < case IsE.

Subgoal 6:

Variables: V V_P X Index Lst
Pr : |{expr}- index Lst Index ~~> eq Lst Index
V : vars (index Lst Index) V
V_P : vars (eq Lst Index) V_P
Mem : mem X V
H1 : is_expr Lst
H2 : is_expr Index
============================
 mem X V_P
 < V: case V.

Subgoal 6:

Variables: V V_P X Index Lst VL VI
Pr : |{expr}- index Lst Index ~~> eq Lst Index
V_P : vars (eq Lst Index) V_P
Mem : mem X V
H1 : is_expr Lst
H2 : is_expr Index
V : vars Lst VL
V1 : vars Index VI
V2 : VL ++ VI = V
============================
 mem X V_P
 < V_P: case V_P.

Subgoal 6:

Variables: V V_P X Index Lst VL VI V2 V3
Pr : |{expr}- index Lst Index ~~> eq Lst Index
Mem : mem X V
H1 : is_expr Lst
H2 : is_expr Index
V : vars Lst VL
V1 : vars Index VI
V2 : VL ++ VI = V
V_P : vars Lst V2
V_P1 : vars Index V3
V_P2 : V2 ++ V3 = V_P
============================
 mem X V_P
 < apply vars_unique to _ V V_P.

Subgoal 6:

Variables: V V_P X Index Lst VI V2 V3
Pr : |{expr}- index Lst Index ~~> eq Lst Index
Mem : mem X V
H1 : is_expr Lst
H2 : is_expr Index
V : vars Lst V2
V1 : vars Index VI
V2 : V2 ++ VI = V
V_P : vars Lst V2
V_P1 : vars Index V3
V_P2 : V2 ++ V3 = V_P
============================
 mem X V_P
 < apply vars_unique to _ V1 V_P1.

Subgoal 6:

Variables: V V_P X Index Lst V2 V3
Pr : |{expr}- index Lst Index ~~> eq Lst Index
Mem : mem X V
H1 : is_expr Lst
H2 : is_expr Index
V : vars Lst V2
V1 : vars Index V3
V2 : V2 ++ V3 = V
V_P : vars Lst V2
V_P1 : vars Index V3
V_P2 : V2 ++ V3 = V_P
============================
 mem X V_P
 < apply append_unique to V2 V_P2.

Subgoal 6:

Variables: V_P X Index Lst V2 V3
Pr : |{expr}- index Lst Index ~~> eq Lst Index
Mem : mem X V_P
H1 : is_expr Lst
H2 : is_expr Index
V : vars Lst V2
V1 : vars Index V3
V2 : V2 ++ V3 = V_P
V_P : vars Lst V2
V_P1 : vars Index V3
V_P2 : V2 ++ V3 = V_P
============================
 mem X V_P
 < search.

Subgoal 7:

Variables: E_P V V_P X
Pr : |{expr}- looseEval:list:length E_P ~~> E_P
IsE : is_expr (looseEval:list:length E_P)
V : vars (looseEval:list:length E_P) V
V_P : vars E_P V_P
Mem : mem X V
============================
 mem X V_P
 < case IsE.

Subgoal 7:

Variables: E_P V V_P X
Pr : |{expr}- looseEval:list:length E_P ~~> E_P
V : vars (looseEval:list:length E_P) V
V_P : vars E_P V_P
Mem : mem X V
H1 : is_expr E_P
============================
 mem X V_P
 < V: case V.

Subgoal 7:

Variables: E_P V V_P X
Pr : |{expr}- looseEval:list:length E_P ~~> E_P
V_P : vars E_P V_P
Mem : mem X V
H1 : is_expr E_P
V : vars E_P V
============================
 mem X V_P
 < apply vars_unique to _ V_P V.

Subgoal 7:

Variables: E_P V X
Pr : |{expr}- looseEval:list:length E_P ~~> E_P
V_P : vars E_P V
Mem : mem X V
H1 : is_expr E_P
V : vars E_P V
============================
 mem X V
 < search.

Proof completed.
 < Prove looseEval:host:typeOf_isTy.

Subgoal 1.22:

Variables: FT ET Ty1
IH_E : 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
IH_A : 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
IH_RF : 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.22:

Variables: FT ET Ty1
IH_E : 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
IH_A : 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
IH_RF : 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.23:

Variables: FT ET Ty1 E2 E1
IH_E : 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
IH_A : 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
IH_RF : 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.23:

Variables: FT ET Ty1 E2 E1
IH_E : 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
IH_A : 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
IH_RF : 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_E to _ _ _ Ty1.

Subgoal 1.23:

Variables: FT ET Ty1 E2 E1
IH_E : 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
IH_A : 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
IH_RF : 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.24:

Variables: FT ET Ty E1
IH_E : 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
IH_A : 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
IH_RF : 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.24:

Variables: FT ET Ty E1
IH_E : 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
IH_A : 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
IH_RF : 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
 < IsT: apply IH_E to _ _ _ Ty1.

Subgoal 1.24:

Variables: FT ET Ty E1
IH_E : 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
IH_A : 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
IH_RF : 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
IsT : is_typ (listTy Ty)
============================
 is_typ Ty
 < case IsT.

Subgoal 1.24:

Variables: FT ET Ty E1
IH_E : 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
IH_A : 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
IH_RF : 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.25:

Variables: FT ET Ty1 E1
IH_E : 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
IH_A : 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
IH_RF : 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.25:

Variables: FT ET Ty1 E1
IH_E : 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
IH_A : 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
IH_RF : 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_E to _ _ _ Ty1.

Subgoal 1.25:

Variables: FT ET Ty1 E1
IH_E : 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
IH_A : 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
IH_RF : 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.26:

Variables: FT ET Ty1 E1
IH_E : 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
IH_A : 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
IH_RF : 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.27:

Variables: FT ET Ty I L
IH_E : 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
IH_A : 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
IH_RF : 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.27:

Variables: FT ET Ty I L
IH_E : 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
IH_A : 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
IH_RF : 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
 < IsT: apply IH_E to _ _ _ Ty1.

Subgoal 1.27:

Variables: FT ET Ty I L
IH_E : 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
IH_A : 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
IH_RF : 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
IsT : is_typ (listTy Ty)
============================
 is_typ Ty
 < case IsT.

Subgoal 1.27:

Variables: FT ET Ty I L
IH_E : 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
IH_A : 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
IH_RF : 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.28:

Variables: FT ET Ty1 E1
IH_E : 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
IH_A : 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
IH_RF : 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 (looseEval: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 (looseEval:list:length E1) intTy @
Ty1 : typeOf FT ET E1 (listTy Ty1) *
============================
 is_typ intTy
 < search.

Proof completed.
 < Prove looseEval:host:stmtOK_isCtx.

Subgoal 12:

Variables: FT ET' Ty E I L
IH : 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'
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 13:

Variables: FT ET' Ty TC1 Body L X
IH : 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'
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 looseEval: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 looseEval: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 looseEval: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 looseEval:host:typeOf_unique.

Subgoal 1.22:

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_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.22:

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_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.23:

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_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.23:

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_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.23:

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_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.23:

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_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.24:

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_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.24:

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_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.24:

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_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.24:

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_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.25:

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_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.25:

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_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.25:

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_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.25:

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_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.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_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 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_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 @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 (listTy Ty) *
H1 : typeOf FT ET_B E1 (listTy Ty1)
============================
 boolTy = boolTy
 < search.

Subgoal 1.27:

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_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.27:

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_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.27:

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_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.27:

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_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.28:

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_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 (looseEval: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 (looseEval:list:length E1) intTy @
TyB : typeOf FT ET_B (looseEval: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.28:

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_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 (looseEval: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 (looseEval: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.

Proof completed.
 < Prove looseEval:host:stmtOK_unique.

Subgoal 12:

Variables: FT ET_B ET_A' ET_B' Ty E I L
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'
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 12:

Variables: FT ET_A' ET_B' Ty E I L Ty1
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'
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 13:

Variables: FT ET_B ET_A' ET_B' Ty TC1 Body L X
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'
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'
 < case TyB.

Subgoal 13:

Variables: FT ET_A' ET_B' Ty TC1 Body L X Ty1 TC2
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'
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 *
H1 : typeOf FT ET_B' L (listTy Ty1)
H2 : stmtOK FT ([(X, Ty1)]::ET_B') Body TC2
============================
 lookup_all_scopes ET_A' ET_B'
 < search.

Proof completed.
 < Prove looseEval:host:paramTy_is.

Proof completed.
 < Prove looseEval:host:getFunInfo_is.

Proof completed.
 < Prove looseEval:host:paramTy_exists.

Proof completed.
 < Prove looseEval: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 IsV LI.

Variables: L I V
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
IsV : is_value L
LI : listIndex L I V @
============================
 is_value V
 < LI: case LI.

Subgoal 1:

Variables: V Tl
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
IsV : is_value (consVal V Tl)
============================
 is_value V
 < case IsV.

Subgoal 1:

Variables: V Tl
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
H1 : is_value V
H2 : is_value Tl
============================
 is_value V
 < search.

Subgoal 2:

Variables: I V I1 Tl Hd
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
IsV : is_value (consVal Hd Tl)
LI : I - 1 = I1
LI1 : listIndex Tl I1 V *
============================
 is_value V
 < case IsV.

Subgoal 2:

Variables: I V I1 Tl Hd
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
LI : I - 1 = I1
LI1 : listIndex Tl I1 V *
H1 : is_value Hd
H2 : is_value Tl
============================
 is_value V
 < apply IH to _ LI1.

Subgoal 2:

Variables: I V I1 Tl Hd
IH : forall L I V, is_value L -> listIndex L I V * -> is_value V
LI : I - 1 = I1
LI1 : listIndex Tl I1 V *
H1 : is_value Hd
H2 : is_value Tl
H3 : is_value V
============================
 is_value V
 < search.

Proof completed.
 < Theorem listLength_is :
     forall L I, listLength L I -> is_integer I.

============================
 forall L I, listLength L I -> is_integer I
 < induction on 1.

IH : forall L I, listLength L I * -> is_integer I
============================
 forall L I, listLength L I @ -> is_integer I
 < intros LL.

Variables: L I
IH : forall L I, listLength L I * -> is_integer I
LL : listLength L I @
============================
 is_integer I
 < LL: case LL.

Subgoal 1:

IH : forall L I, listLength L I * -> is_integer I
============================
 is_integer 0
 < search.

Subgoal 2:

Variables: I I1 Tl Hd
IH : forall L I, listLength L I * -> is_integer I
LL : listLength Tl I1 *
LL1 : I1 + 1 = I
============================
 is_integer I
 < apply IH to LL.

Subgoal 2:

Variables: I I1 Tl Hd
IH : forall L I, listLength L I * -> is_integer I
LL : listLength Tl I1 *
LL1 : I1 + 1 = I
H1 : is_integer I1
============================
 is_integer I
 < apply plus_integer_is_integer to _ _ LL1.

Subgoal 2:

Variables: I I1 Tl Hd
IH : forall L I, listLength L I * -> is_integer I
LL : listLength Tl I1 *
LL1 : I1 + 1 = I
H1 : is_integer I1
H2 : is_integer I
============================
 is_integer I
 < search.

Proof completed.
 < Theorem updateListIndex_is :
     forall L I V L',
       is_value L -> is_value V -> updateListIndex L I V L' -> is_value L'.

============================
 forall L I V L',
   is_value L -> is_value V -> updateListIndex L I V L' -> is_value L'
 < induction on 3.

IH : forall L I V L',
       is_value L -> is_value V -> updateListIndex L I V L' * -> is_value L'
============================
 forall L I V L',
   is_value L -> is_value V -> updateListIndex L I V L' @ -> is_value L'
 < intros IsL IsV ULI.

Variables: L I V L'
IH : forall L I V L',
       is_value L -> is_value V -> updateListIndex L I V L' * -> is_value L'
IsL : is_value L
IsV : is_value V
ULI : updateListIndex L I V L' @
============================
 is_value L'
 < ULI: case ULI.

Subgoal 1:

Variables: V Tl VOld
IH : forall L I V L',
       is_value L -> is_value V -> updateListIndex L I V L' * -> is_value L'
IsL : is_value (consVal VOld Tl)
IsV : is_value V
============================
 is_value (consVal V Tl)
 < case IsL.

Subgoal 1:

Variables: V Tl VOld
IH : forall L I V L',
       is_value L -> is_value V -> updateListIndex L I V L' * -> is_value L'
IsV : is_value V
H1 : is_value VOld
H2 : is_value Tl
============================
 is_value (consVal V Tl)
 < search.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V L',
       is_value L -> is_value V -> updateListIndex L I V L' * -> is_value L'
IsL : is_value (consVal X Tl)
IsV : is_value V
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
============================
 is_value (consVal X TlNew)
 < case IsL.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V L',
       is_value L -> is_value V -> updateListIndex L I V L' * -> is_value L'
IsV : is_value V
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
H1 : is_value X
H2 : is_value Tl
============================
 is_value (consVal X TlNew)
 < apply IH to _ _ ULI1.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V L',
       is_value L -> is_value V -> updateListIndex L I V L' * -> is_value L'
IsV : is_value V
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
H1 : is_value X
H2 : is_value Tl
H3 : is_value TlNew
============================
 is_value (consVal X TlNew)
 < search.

Proof completed.
 < Prove looseEval:host:evalExpr_isValue,
         looseEval:host:evalStmt_isCtx,
         looseEval:host:evalArgs_isValue,
         looseEval: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.26:

Variables: FE EE Ty
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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) nilVal [] @
============================
 is_value nilVal
 < case IsE.

Subgoal 1.26:

Variables: FE EE Ty
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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) nilVal [] @
H1 : is_typ Ty
============================
 is_value nilVal
 < search.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
============================
 is_value (consVal V1 V2)
 < case IsE.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 is_value (consVal V1 V2)
 < apply IH_V_E to _ _ _ Ev1.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_value V1
============================
 is_value (consVal V1 V2)
 < apply IH_V_E to _ _ _ Ev2.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_value V1
H4 : is_value V2
============================
 is_value (consVal V1 V2)
 < search.

Subgoal 1.28:

Variables: FE EE V O Tl E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 (consVal V Tl) O *
============================
 is_value V
 < case IsE.

Subgoal 1.28:

Variables: FE EE V O Tl E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 (consVal V Tl) O *
H1 : is_expr E1
============================
 is_value V
 < IsV: apply IH_V_E to _ _ _ Ev1.

Subgoal 1.28:

Variables: FE EE V O Tl E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 (consVal V Tl) O *
H1 : is_expr E1
IsV : is_value (consVal V Tl)
============================
 is_value V
 < case IsV.

Subgoal 1.28:

Variables: FE EE V O Tl E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 (consVal V Tl) O *
H1 : is_expr E1
H2 : is_value V
H3 : is_value Tl
============================
 is_value V
 < search.

Subgoal 1.29:

Variables: FE EE V O Hd E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 (consVal Hd V) O *
============================
 is_value V
 < case IsE.

Subgoal 1.29:

Variables: FE EE V O Hd E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 (consVal Hd V) O *
H1 : is_expr E1
============================
 is_value V
 < IsV: apply IH_V_E to _ _ _ Ev1.

Subgoal 1.29:

Variables: FE EE V O Hd E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 (consVal Hd V) O *
H1 : is_expr E1
IsV : is_value (consVal Hd V)
============================
 is_value V
 < case IsV.

Subgoal 1.29:

Variables: FE EE V O Hd E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE E1 (consVal Hd V) O *
H1 : is_expr E1
H2 : is_value Hd
H3 : is_value V
============================
 is_value V
 < search.

Subgoal 1.30:

Variables: FE EE O E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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) trueVal O @
Ev1 : evalExpr FE EE E1 nilVal O *
============================
 is_value trueVal
 < search.

Subgoal 1.31:

Variables: FE EE O Hd Tl E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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) falseVal O @
Ev1 : evalExpr FE EE E1 (consVal Hd Tl) O *
============================
 is_value falseVal
 < search.

Subgoal 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 is_value V
 < case IsE.

Subgoal 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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 1.33:

Variables: FE EE O V1 I E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 (looseEval: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 (looseEval:list:length E1) (intVal I) O @
Ev1 : evalExpr FE EE E1 V1 O *
Ev2 : listLength V1 I
============================
 is_value (intVal I)
 < case IsE.

Subgoal 1.33:

Variables: FE EE O V1 I E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 (looseEval:list:length E1) (intVal I) O @
Ev1 : evalExpr FE EE E1 V1 O *
Ev2 : listLength V1 I
H1 : is_expr E1
============================
 is_value (intVal I)
 < apply listLength_is to Ev2.

Subgoal 1.33:

Variables: FE EE O V1 I E1
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 (looseEval:list:length E1) (intVal I) O @
Ev1 : evalExpr FE EE E1 V1 O *
Ev2 : listLength V1 I
H1 : is_expr E1
H2 : is_integer I
============================
 is_value (intVal I)
 < search.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE EE'
Ev6 : O2 ++ O3 = O
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < case IsS.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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 lookupScopes_is to _ Ev1.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_value LV
H5 : is_string L
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_V_E to _ _ _ Ev3.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_value LV
H5 : is_string L
H6 : is_value V
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply updateListIndex_is to _ _ Ev4.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_value LV
H5 : is_string L
H6 : is_value V
H7 : is_value LV2
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply replaceScopes_is to _ _ Ev5.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_value LV
H5 : is_string L
H6 : is_value V
H7 : is_value LV2
H8 : 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.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O2 *
Ev2 : iterateList FE EE LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < case IsS.

Subgoal 2.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O2 *
Ev2 : iterateList FE EE 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_V_E to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O2 *
Ev2 : iterateList FE EE LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_value LV
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_IL to _ _ _ _ _ Ev2.

Subgoal 2.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 O2 *
Ev2 : iterateList FE EE LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_value LV
H5 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 5.1:

Variables: FE X Body EE'
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_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' nilVal X Body EE' [] @
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Subgoal 5.2:

Variables: FE EE X Body EE' O Scope EE3 O2 O3 Tl Hd
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < case IsV.

Subgoal 5.2:

Variables: FE EE X Body EE' O Scope EE3 O2 O3 Tl Hd
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < IsEE3+: apply IH_C_S to _ _ _ IL1.

Subgoal 5.2:

Variables: FE EE X Body EE' O Scope EE3 O2 O3 Tl Hd
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
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 5.2:

Variables: FE EE X Body EE' O Scope EE3 O2 O3 Tl Hd
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
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 IH_IL to _ _ _ _ _ IL2.

Subgoal 5.2:

Variables: FE EE X Body EE' O Scope EE3 O2 O3 Tl Hd
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
           is_list is_value V
IH_V_RF : forall FE 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 O * ->
            is_recFieldVals 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
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_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Proof completed.
 < Prove looseEval:host:evalExpr_isOutput,
         looseEval:host:evalStmt_isOutput,
         looseEval:host:evalArgs_isOutput,
         looseEval: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.26:

Variables: FE EE Ty
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) nilVal [] @
============================
 is_list is_value []
 < search.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
============================
 is_list is_value O
 < case IsE.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 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.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 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 IH_E to _ _ _ Ev2.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
============================
 is_list is_value O
 < apply append_values_is to _ _ Ev3.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_list is_value O2
H4 : is_list is_value O3
H5 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 1.28:

Variables: FE EE V O Tl E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O @
Ev1 : evalExpr FE EE E1 (consVal V Tl) O *
============================
 is_list is_value O
 < case IsE.

Subgoal 1.28:

Variables: FE EE V O Tl E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O @
Ev1 : evalExpr FE EE E1 (consVal V Tl) O *
H1 : is_expr E1
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.28:

Variables: FE EE V O Tl E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O @
Ev1 : evalExpr FE EE E1 (consVal V Tl) O *
H1 : is_expr E1
H2 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 1.29:

Variables: FE EE V O Hd E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O @
Ev1 : evalExpr FE EE E1 (consVal Hd V) O *
============================
 is_list is_value O
 < case IsE.

Subgoal 1.29:

Variables: FE EE V O Hd E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O @
Ev1 : evalExpr FE EE E1 (consVal Hd V) O *
H1 : is_expr E1
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.29:

Variables: FE EE V O Hd E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O @
Ev1 : evalExpr FE EE E1 (consVal Hd V) O *
H1 : is_expr E1
H2 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 1.30:

Variables: FE EE O E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) trueVal O @
Ev1 : evalExpr FE EE E1 nilVal O *
============================
 is_list is_value O
 < case IsE.

Subgoal 1.30:

Variables: FE EE O E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) trueVal O @
Ev1 : evalExpr FE EE E1 nilVal O *
H1 : is_expr E1
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.30:

Variables: FE EE O E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) trueVal O @
Ev1 : evalExpr FE EE E1 nilVal O *
H1 : is_expr E1
H2 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 1.31:

Variables: FE EE O Hd Tl E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) falseVal O @
Ev1 : evalExpr FE EE E1 (consVal Hd Tl) O *
============================
 is_list is_value O
 < case IsE.

Subgoal 1.31:

Variables: FE EE O Hd Tl E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) falseVal O @
Ev1 : evalExpr FE EE E1 (consVal Hd Tl) O *
H1 : is_expr E1
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.31:

Variables: FE EE O Hd Tl E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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) falseVal O @
Ev1 : evalExpr FE EE E1 (consVal Hd Tl) O *
H1 : is_expr E1
H2 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 is_list is_value O
 < case IsE.

Subgoal 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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 V O LV O2 Idx O3 I L
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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 IH_E to _ _ _ Ev2.

Subgoal 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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_value O3
============================
 is_list is_value O
 < apply append_values_is to _ _ Ev4.

Subgoal 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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_value O3
H5 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 1.33:

Variables: FE EE O V1 I E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 (looseEval: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 (looseEval:list:length E1) (intVal I) O @
Ev1 : evalExpr FE EE E1 V1 O *
Ev2 : listLength V1 I
============================
 is_list is_value O
 < case IsE.

Subgoal 1.33:

Variables: FE EE O V1 I E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 (looseEval:list:length E1) (intVal I) O @
Ev1 : evalExpr FE EE E1 V1 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 O V1 I E1
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 (looseEval:list:length E1) (intVal I) O @
Ev1 : evalExpr FE EE E1 V1 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 LV N O2 V O3 LV2 E I L
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE EE'
Ev6 : O2 ++ O3 = O
============================
 is_list is_value O
 < case IsS.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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 _ _ _ Ev2.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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 IH_E to _ _ _ Ev3.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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_value O3
============================
 is_list is_value O
 < apply append_values_is to _ _ Ev6.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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_value O3
H6 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 2.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O2 *
Ev2 : iterateList FE EE 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 O2 O3 Body L X
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O2 *
Ev2 : iterateList FE EE 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 O2 O3 Body L X
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O2 *
Ev2 : iterateList FE EE 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 O2 O3 Body L X
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O2 *
Ev2 : iterateList FE EE 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 IH_IL to _ _ _ _ _ Ev2.

Subgoal 2.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O2 *
Ev2 : iterateList FE EE 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_value O3
============================
 is_list is_value O
 < apply append_values_is to _ _ Ev3.

Subgoal 2.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 O2 *
Ev2 : iterateList FE EE 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_value O3
H7 : is_list is_value O
============================
 is_list is_value O
 < search.

Subgoal 5.1:

Variables: FE X Body EE'
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_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' nilVal X Body EE' [] @
============================
 is_list is_value []
 < search.

Subgoal 5.2:

Variables: FE EE X Body EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
============================
 is_list is_value O
 < case IsV.

Subgoal 5.2:

Variables: FE EE X Body EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
============================
 is_list is_value O
 < apply IH_S to _ _ _ IL1.

Subgoal 5.2:

Variables: FE EE X Body EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : is_list is_value O2
============================
 is_list is_value O
 < IsEE3+: apply evalStmt_isCtx to _ _ _ IL1.

Subgoal 5.2:

Variables: FE EE X Body EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : is_list is_value O2
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 Scope EE3 O2 O3 Tl Hd
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : is_list is_value O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 is_list is_value O
 < apply IH_IL to _ _ _ _ _ IL2.

Subgoal 5.2:

Variables: FE EE X Body EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : is_list is_value O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_list is_value O3
============================
 is_list is_value O
 < apply append_values_is to _ _ IL3.

Subgoal 5.2:

Variables: FE EE X Body EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall FE 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 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 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 O * ->
         is_list is_value O
IH_RF : forall FE 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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : is_list is_value O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : is_list is_value O3
H7 : is_list is_value O
============================
 is_list is_value O
 < search.

Proof completed.
 < Prove looseEval:host:paramName_is.

Proof completed.
 < Prove looseEval:host:getFunEvalInfo_is.

Proof completed.
 < Prove looseEval:host:evalProgram_isOutput.

Proof completed.
 < Prove looseEval:host:evalStmt_names_same
   with
      iterateList_names_same : 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 ->
         names_same EE EE'
      on IL as IH_IL.

Subgoal 1.15:

Variables: FE Scope EE EE' O LV N O2 V O3 LV2 E I L
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_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 * ->
          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 : lookupScopes L (Scope::EE) LV
Ev2 : evalExpr FE (Scope::EE) I (intVal N) O2 *
Ev3 : evalExpr FE (Scope::EE) E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 (Scope::EE) EE'
Ev6 : O2 ++ O3 = O
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < case IsS.

Subgoal 1.15:

Variables: FE Scope EE EE' O LV N O2 V O3 LV2 E I L
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_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 * ->
          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 : lookupScopes L (Scope::EE) LV
Ev2 : evalExpr FE (Scope::EE) I (intVal N) O2 *
Ev3 : evalExpr FE (Scope::EE) E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 (Scope::EE) 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: apply replaceScopes_names_same to _ Ev5.

Subgoal 1.15:

Variables: FE Scope EE EE' O LV N O2 V O3 LV2 E I L
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_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 * ->
          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 : lookupScopes L (Scope::EE) LV
Ev2 : evalExpr FE (Scope::EE) I (intVal N) O2 *
Ev3 : evalExpr FE (Scope::EE) E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 (Scope::EE) EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
NS : names_same (Scope::EE) EE'
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < case NS.

Subgoal 1.15:

Variables: FE Scope EE O LV N O2 V O3 LV2 E I L BRest B
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_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 * ->
          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 : lookupScopes L (Scope::EE) LV
Ev2 : evalExpr FE (Scope::EE) I (intVal N) O2 *
Ev3 : evalExpr FE (Scope::EE) E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 (Scope::EE) (B::BRest)
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H5 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H6 : names_same EE BRest
============================
 exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
 < search.

Subgoal 1.16:

Variables: FE Scope EE EE' O LV O2 O3 Body L X
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_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 * ->
          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 O2 *
Ev2 : iterateList FE (Scope::EE) LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < case IsS.

Subgoal 1.16:

Variables: FE Scope EE EE' O LV O2 O3 Body L X
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_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 * ->
          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 O2 *
Ev2 : iterateList FE (Scope::EE) 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''
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 1.16:

Variables: FE Scope EE EE' O LV O2 O3 Body L X
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_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 * ->
          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 O2 *
Ev2 : iterateList FE (Scope::EE) LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_value LV
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < NS: apply IH_IL to _ _ _ _ _ Ev2.

Subgoal 1.16:

Variables: FE Scope EE EE' O LV O2 O3 Body L X
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_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 * ->
          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 O2 *
Ev2 : iterateList FE (Scope::EE) LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_value LV
NS : names_same (Scope::EE) EE'
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < case NS.

Subgoal 1.16:

Variables: FE Scope EE O LV O2 O3 Body L X BRest B
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_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 * ->
          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 O2 *
Ev2 : iterateList FE (Scope::EE) LV X Body (B::BRest) O3 *
Ev3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : is_value LV
H5 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H6 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H7 : names_same EE BRest
============================
 exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
 < search.

Subgoal 2.1:

Variables: X Body FE 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_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 * ->
          names_same EE EE'
IsV : is_value nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_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' nilVal X Body EE' [] @
============================
 names_same EE' EE'
 < backchain names_same_reflexive.

Subgoal 2.2:

Variables: X Body FE EE EE' O Scope EE3 O2 O3 Tl Hd
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_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 * ->
          names_same EE EE'
IsV : is_value (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
============================
 names_same EE EE'
 < case IsV.

Subgoal 2.2:

Variables: X Body FE EE EE' O Scope EE3 O2 O3 Tl Hd
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_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 * ->
          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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
============================
 names_same EE EE'
 < IsEE3+: apply evalStmt_isCtx to _ _ _ IL1.

Subgoal 2.2:

Variables: X Body FE EE EE' O Scope EE3 O2 O3 Tl Hd
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_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 * ->
          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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
 names_same EE EE'
 < case IsEE3+.

Subgoal 2.2:

Variables: X Body FE EE EE' O Scope EE3 O2 O3 Tl Hd
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_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 * ->
          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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 names_same EE EE'
 < NS1: apply IH_S to _ _ _ IL1.

Subgoal 2.2:

Variables: X Body FE EE EE' O O2 O3 Tl Hd Scope' 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_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 * ->
          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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : is_list (is_pair is_string is_value) Scope'
H4 : is_list (is_list (is_pair is_string is_value)) EE''
NS1 : names_same EE EE''
============================
 names_same EE EE'
 < NS2: apply IH_IL to _ _ _ _ _ IL2.

Subgoal 2.2:

Variables: X Body FE EE EE' O O2 O3 Tl Hd Scope' 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_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 * ->
          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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : is_list (is_pair is_string is_value) Scope'
H4 : is_list (is_list (is_pair is_string is_value)) EE''
NS1 : names_same EE EE''
NS2 : names_same EE'' EE'
============================
 names_same EE EE'
 < apply names_same_transitive to NS1 NS2.

Subgoal 2.2:

Variables: X Body FE EE EE' O O2 O3 Tl Hd Scope' 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_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 * ->
          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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : is_list (is_pair is_string is_value) Scope'
H4 : is_list (is_list (is_pair is_string is_value)) EE''
NS1 : names_same EE EE''
NS2 : names_same EE'' EE'
H5 : names_same EE EE'
============================
 names_same EE EE'
 < search.

Proof completed.
 < Add_Ext_Size looseEval:host:evalExpr,
   looseEval:host:evalArgs,
   looseEval:host:evalRecFields,
   looseEval:host:evalStmt
   with iterateList FE EE V X Body EE' O.

Proof completed.
 < Add_Proj_Rel looseEval:host:evalExpr,
   looseEval:host:evalArgs,
   looseEval:host:evalRecFields,
   looseEval:host:evalStmt
   with iterateList FE EE V X Body EE' O.

Proof completed.
 < Theorem listIndex_geq_0 :
     forall L I V, listIndex L I V -> is_integer I -> I >= 0.

============================
 forall L I V, listIndex L I V -> is_integer I -> I >= 0
 < induction on 1.

IH : forall L I V, listIndex L I V * -> is_integer I -> I >= 0
============================
 forall L I V, listIndex L I V @ -> is_integer I -> I >= 0
 < intros LI IsI.

Variables: L I V
IH : forall L I V, listIndex L I V * -> is_integer I -> I >= 0
LI : listIndex L I V @
IsI : is_integer I
============================
 I >= 0
 < LI: case LI.

Subgoal 1:

Variables: V Tl
IH : forall L I V, listIndex L I V * -> is_integer I -> I >= 0
IsI : is_integer 0
============================
 0 >= 0
 < search.

Subgoal 2:

Variables: I V I1 Tl Hd
IH : forall L I V, listIndex L I V * -> is_integer I -> I >= 0
IsI : is_integer I
LI : I - 1 = I1
LI1 : listIndex Tl I1 V *
============================
 I >= 0
 < apply minus_integer_is_integer to _ _ LI.

Subgoal 2:

Variables: I V I1 Tl Hd
IH : forall L I V, listIndex L I V * -> is_integer I -> I >= 0
IsI : is_integer I
LI : I - 1 = I1
LI1 : listIndex Tl I1 V *
H1 : is_integer I1
============================
 I >= 0
 < apply IH to LI1 _.

Subgoal 2:

Variables: I V I1 Tl Hd
IH : forall L I V, listIndex L I V * -> is_integer I -> I >= 0
IsI : is_integer I
LI : I - 1 = I1
LI1 : listIndex Tl I1 V *
H1 : is_integer I1
H2 : I1 >= 0
============================
 I >= 0
 < P: apply minus_plus_same_integer to _ _ LI.

Subgoal 2:

Variables: I V I1 Tl Hd
IH : forall L I V, listIndex L I V * -> is_integer I -> I >= 0
IsI : is_integer I
LI : I - 1 = I1
LI1 : listIndex Tl I1 V *
H1 : is_integer I1
H2 : I1 >= 0
P : I1 + 1 = I
============================
 I >= 0
 < apply greatereq_integer__add_positive to _ _ P.

Subgoal 2:

Variables: I V I1 Tl Hd
IH : forall L I V, listIndex L I V * -> is_integer I -> I >= 0
IsI : is_integer I
LI : I - 1 = I1
LI1 : listIndex Tl I1 V *
H1 : is_integer I1
H2 : I1 >= 0
P : I1 + 1 = I
H3 : 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 Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIB : listIndex (consVal VA Tl) 0 VB
============================
 VA = VB
 < LIB: case LIB.

Subgoal 1.1:

Variables: VB Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
============================
 VB = VB
 < search.

Subgoal 1.2:

Variables: VA VB Tl I1
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIB : 0 - 1 = I1
LIB1 : listIndex Tl I1 VB
============================
 VA = VB
 < compute LIB.

Subgoal 1.2:

Variables: VA VB Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIB : 0 - 1 = -1
LIB1 : listIndex Tl -1 VB
============================
 VA = VB
 < GEq: apply listIndex_geq_0 to LIB1 _.

Subgoal 1.2:

Variables: VA VB Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIB : 0 - 1 = -1
LIB1 : listIndex Tl -1 VB
GEq : -1 >= 0
============================
 VA = VB
 < LEq: case GEq.

Subgoal 1.2:

Variables: VA VB Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIB : 0 - 1 = -1
LIB1 : listIndex Tl -1 VB
LEq : 0 <= -1
============================
 VA = VB
 < case LEq.

Subgoal 2:

Variables: I VA VB I1 Tl Hd
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIB : listIndex (consVal Hd Tl) I VB
LIA : I - 1 = I1
LIA1 : listIndex Tl I1 VA *
============================
 VA = VB
 < LIB: case LIB.

Subgoal 2.1:

Variables: VA VB I1 Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : 0 - 1 = I1
LIA1 : listIndex Tl I1 VA *
============================
 VA = VB
 < compute LIA.

Subgoal 2.1:

Variables: VA VB Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : 0 - 1 = -1
LIA1 : listIndex Tl -1 VA *
============================
 VA = VB
 < GEq: apply listIndex_geq_0 to LIA1 _.

Subgoal 2.1:

Variables: VA VB Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : 0 - 1 = -1
LIA1 : listIndex Tl -1 VA *
GEq : -1 >= 0
============================
 VA = VB
 < LEq: case GEq.

Subgoal 2.1:

Variables: VA VB Tl
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : 0 - 1 = -1
LIA1 : listIndex Tl -1 VA *
LEq : 0 <= -1
============================
 VA = VB
 < case LEq.

Subgoal 2.2:

Variables: I VA VB I1 Tl Hd I2
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : I - 1 = I1
LIA1 : listIndex Tl I1 VA *
LIB : I - 1 = I2
LIB1 : listIndex Tl I2 VB
============================
 VA = VB
 < apply minus_integer_unique to LIA LIB.

Subgoal 2.2:

Variables: I VA VB Tl Hd I2
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : I - 1 = I2
LIA1 : listIndex Tl I2 VA *
LIB : I - 1 = I2
LIB1 : listIndex Tl I2 VB
============================
 VA = VB
 < apply IH to LIA1 LIB1.

Subgoal 2.2:

Variables: I VB Tl Hd I2
IH : forall L I VA VB, listIndex L I VA * -> listIndex L I VB -> VA = VB
LIA : I - 1 = I2
LIA1 : listIndex Tl I2 VB *
LIB : I - 1 = I2
LIB1 : listIndex Tl 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
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLB : listLength nilVal IB
============================
 0 = IB
 < LLB: case LLB.

Subgoal 1:

IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
============================
 0 = 0
 < search.

Subgoal 2:

Variables: IA IB I Tl Hd
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLB : listLength (consVal Hd Tl) IB
LLA : listLength Tl I *
LLA1 : I + 1 = IA
============================
 IA = IB
 < LLB: case LLB.

Subgoal 2:

Variables: IA IB I Tl Hd I1
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLA : listLength Tl I *
LLA1 : I + 1 = IA
LLB : listLength Tl I1
LLB1 : I1 + 1 = IB
============================
 IA = IB
 < apply IH to LLA LLB.

Subgoal 2:

Variables: IA IB Tl Hd I1
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLA : listLength Tl I1 *
LLA1 : I1 + 1 = IA
LLB : listLength Tl I1
LLB1 : I1 + 1 = IB
============================
 IA = IB
 < apply plus_integer_unique to LLA1 LLB1.

Subgoal 2:

Variables: IB Tl Hd I1
IH : forall L IA IB, listLength L IA * -> listLength L IB -> IA = IB
LLA : listLength Tl I1 *
LLA1 : I1 + 1 = IB
LLB : listLength Tl I1
LLB1 : 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 Tl VOld
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer 0
============================
 0 >= 0
 < search.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
============================
 I >= 0
 < apply minus_integer_is_integer to _ _ ULI.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
H1 : is_integer I1
============================
 I >= 0
 < apply IH to _ ULI1.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
H1 : is_integer I1
H2 : I1 >= 0
============================
 I >= 0
 < P: apply minus_plus_same_integer to _ _ ULI.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
H1 : is_integer I1
H2 : I1 >= 0
P : I1 + 1 = I
============================
 I >= 0
 < apply greatereq_integer__add_positive to _ _ P.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V Out, is_integer I -> updateListIndex L I V Out * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
H1 : is_integer I1
H2 : I1 >= 0
P : I1 + 1 = I
H3 : 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 Tl VOld
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIB : updateListIndex (consVal VOld Tl) 0 V OutB
============================
 consVal V Tl = OutB
 < ULIB: case ULIB.

Subgoal 1.1:

Variables: V Tl VOld
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
============================
 consVal V Tl = consVal V Tl
 < search.

Subgoal 1.2:

Variables: V Tl VOld I1 TlNew
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIB : 0 - 1 = I1
ULIB1 : updateListIndex Tl I1 V TlNew
============================
 consVal V Tl = consVal VOld TlNew
 < compute ULIB.

Subgoal 1.2:

Variables: V Tl VOld TlNew
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIB : 0 - 1 = -1
ULIB1 : updateListIndex Tl -1 V TlNew
============================
 consVal V Tl = consVal VOld TlNew
 < GEq: apply updateListIndex_geq_0 to _ ULIB1.

Subgoal 1.2:

Variables: V Tl VOld TlNew
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIB : 0 - 1 = -1
ULIB1 : updateListIndex Tl -1 V TlNew
GEq : -1 >= 0
============================
 consVal V Tl = consVal VOld TlNew
 < LEq: case GEq.

Subgoal 1.2:

Variables: V Tl VOld TlNew
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIB : 0 - 1 = -1
ULIB1 : updateListIndex Tl -1 V TlNew
LEq : 0 <= -1
============================
 consVal V Tl = consVal VOld TlNew
 < case LEq.

Subgoal 2:

Variables: I V OutB I1 TlNew X Tl
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIB : updateListIndex (consVal X Tl) I V OutB
ULIA : I - 1 = I1
ULIA1 : updateListIndex Tl I1 V TlNew *
============================
 consVal X TlNew = OutB
 < ULIB: case ULIB.

Subgoal 2.1:

Variables: V I1 TlNew X Tl
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : 0 - 1 = I1
ULIA1 : updateListIndex Tl I1 V TlNew *
============================
 consVal X TlNew = consVal V Tl
 < compute ULIA.

Subgoal 2.1:

Variables: V TlNew X Tl
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : 0 - 1 = -1
ULIA1 : updateListIndex Tl -1 V TlNew *
============================
 consVal X TlNew = consVal V Tl
 < GEq: apply updateListIndex_geq_0 to _ ULIA1.

Subgoal 2.1:

Variables: V TlNew X Tl
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : 0 - 1 = -1
ULIA1 : updateListIndex Tl -1 V TlNew *
GEq : -1 >= 0
============================
 consVal X TlNew = consVal V Tl
 < LEq: case GEq.

Subgoal 2.1:

Variables: V TlNew X Tl
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : 0 - 1 = -1
ULIA1 : updateListIndex Tl -1 V TlNew *
LEq : 0 <= -1
============================
 consVal X TlNew = consVal V Tl
 < case LEq.

Subgoal 2.2:

Variables: I V I1 TlNew X Tl I2 TlNew1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : I - 1 = I1
ULIA1 : updateListIndex Tl I1 V TlNew *
ULIB : I - 1 = I2
ULIB1 : updateListIndex Tl I2 V TlNew1
============================
 consVal X TlNew = consVal X TlNew1
 < apply minus_integer_unique to ULIA ULIB.

Subgoal 2.2:

Variables: I V TlNew X Tl I2 TlNew1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : I - 1 = I2
ULIA1 : updateListIndex Tl I2 V TlNew *
ULIB : I - 1 = I2
ULIB1 : updateListIndex Tl I2 V TlNew1
============================
 consVal X TlNew = consVal X TlNew1
 < apply IH to ULIA1 ULIB1.

Subgoal 2.2:

Variables: I V X Tl I2 TlNew1
IH : forall L I V OutA OutB,
       updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB
ULIA : I - 1 = I2
ULIA1 : updateListIndex Tl I2 V TlNew1 *
ULIB : I - 1 = I2
ULIB1 : updateListIndex Tl I2 V TlNew1
============================
 consVal X TlNew1 = consVal X TlNew1
 < search.

Proof completed.
 < Prove looseEval:host:evalExpr_rel,
         looseEval:host:evalStmt_newNameScopes_output,
         looseEval:host:evalStmt_newNameScopes,
         looseEval:host:evalArgs_rel,
         looseEval:host:evalRecFields_rel
   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.26:

Variables: FE EE_A EE_B VB O_B Vars Ty
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) nilVal [] @
EvB : evalExpr FE EE_B (nil Ty) VB O_B
Vars : vars (nil Ty) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
 nilVal = VB /\ [] = O_B
 < case EvB.

Subgoal 1.26:

Variables: FE EE_A EE_B Vars Ty
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) nilVal [] @
Vars : vars (nil Ty) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
============================
 nilVal = nilVal /\ [] = []
 < search.

Subgoal 1.27:

Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 V2 V1 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V1 V2) O_A @
EvB : evalExpr FE EE_B (cons E1 E2) VB O_B
Vars : vars (cons E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O1 ++ O2 = O_A
============================
 consVal V1 V2 = VB /\ O_A = O_B
 < case IsE.

Subgoal 1.27:

Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 V2 V1 E2 E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V1 V2) O_A @
EvB : evalExpr FE EE_B (cons E1 E2) VB O_B
Vars : vars (cons E1 E2) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
============================
 consVal V1 V2 = VB /\ O_A = O_B
 < Vars: case Vars.

Subgoal 1.27:

Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 V2 V1 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V1 V2) O_A @
EvB : evalExpr FE EE_B (cons E1 E2) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
============================
 consVal V1 V2 = VB /\ O_A = O_B
 < EvB: case EvB.

Subgoal 1.27:

Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 V3 V4 O3 O4 V6 V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V1 V2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
============================
 consVal V1 V2 = consVal V5 V6 /\ O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB Vars _.

Subgoal 1.27.1:

Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 V3 V4 O3 O4 V6 V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V1 V2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
============================
 forall X V, mem X V3 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
 < intros M L.

Subgoal 1.27.1:

Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 V3 V4 O3 O4 V6 V5 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V1 V2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V
============================
 lookupScopes X EE_A V
 < M': apply mem_append_left to M Vars2.

Subgoal 1.27.1:

Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 V3 V4 O3 O4 V6 V5 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V1 V2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V
M' : mem X Vars
============================
 lookupScopes X EE_A V
 < apply Rel to M' L.

Subgoal 1.27.1:

Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 V3 V4 O3 O4 V6 V5 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V1 V2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
 lookupScopes X EE_A V
 < search.

Subgoal 1.27:

Variables: FE EE_A EE_B O_A O_B Vars O2 V2 E2 E1 V3 V4 O3 O4 V6 V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V5 V2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
============================
 consVal V5 V2 = consVal V5 V6 /\ O_A = O_B
 < apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.

Subgoal 1.27.2:

Variables: FE EE_A EE_B O_A O_B Vars O2 V2 E2 E1 V3 V4 O3 O4 V6 V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V5 V2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
============================
 forall X V, mem X V4 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
 < intros M L.

Subgoal 1.27.2:

Variables: FE EE_A EE_B O_A O_B Vars O2 V2 E2 E1 V3 V4 O3 O4 V6 V5 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V5 V2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V4
L : lookupScopes X EE_B V
============================
 lookupScopes X EE_A V
 < M': apply mem_append_right to M Vars2.

Subgoal 1.27.2:

Variables: FE EE_A EE_B O_A O_B Vars O2 V2 E2 E1 V3 V4 O3 O4 V6 V5 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V5 V2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V4
L : lookupScopes X EE_B V
M' : mem X Vars
============================
 lookupScopes X EE_A V
 < apply Rel to M' L.

Subgoal 1.27.2:

Variables: FE EE_A EE_B O_A O_B Vars O2 V2 E2 E1 V3 V4 O3 O4 V6 V5 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V5 V2) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
M : mem X V4
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
 lookupScopes X EE_A V
 < search.

Subgoal 1.27:

Variables: FE EE_A EE_B O_A O_B Vars E2 E1 V3 V4 O3 O4 V6 V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V5 V6) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V6 O4 *
EvA3 : O3 ++ O4 = O_A
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
============================
 consVal V5 V6 = consVal V5 V6 /\ O_A = O_B
 < apply append_unique to EvA3 EvB2.

Subgoal 1.27:

Variables: FE EE_A EE_B O_B Vars E2 E1 V3 V4 O3 O4 V6 V5
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) (consVal V5 V6) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V5 O3 *
EvA2 : evalExpr FE EE_A E2 V6 O4 *
EvA3 : O3 ++ O4 = O_B
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvB : evalExpr FE EE_B E1 V5 O3
EvB1 : evalExpr FE EE_B E2 V6 O4
EvB2 : O3 ++ O4 = O_B
============================
 consVal V5 V6 = consVal V5 V6 /\ O_B = O_B
 < search.

Subgoal 1.28:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
EvB : evalExpr FE EE_B (head E1) VB O_B
Vars : vars (head E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal VA Tl) O_A *
============================
 VA = VB /\ O_A = O_B
 < case IsE.

Subgoal 1.28:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
EvB : evalExpr FE EE_B (head E1) VB O_B
Vars : vars (head E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal VA Tl) O_A *
H1 : is_expr E1
============================
 VA = VB /\ O_A = O_B
 < Vars: case Vars.

Subgoal 1.28:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
EvB : evalExpr FE EE_B (head E1) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal VA Tl) O_A *
H1 : is_expr E1
Vars : vars E1 Vars
============================
 VA = VB /\ O_A = O_B
 < EvB: case EvB.

Subgoal 1.28:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1 Tl1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal VA Tl) O_A *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 (consVal VB Tl1) O_B
============================
 VA = VB /\ O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB Vars _.

Subgoal 1.28:

Variables: FE EE_A EE_B VB O_B Vars E1 Tl1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal VB Tl1) O_B *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 (consVal VB Tl1) O_B
============================
 VB = VB /\ O_B = O_B
 < search.

Subgoal 1.29:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
EvB : evalExpr FE EE_B (tail E1) VB O_B
Vars : vars (tail E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal Hd VA) O_A *
============================
 VA = VB /\ O_A = O_B
 < case IsE.

Subgoal 1.29:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
EvB : evalExpr FE EE_B (tail E1) VB O_B
Vars : vars (tail E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal Hd VA) O_A *
H1 : is_expr E1
============================
 VA = VB /\ O_A = O_B
 < Vars: case Vars.

Subgoal 1.29:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
EvB : evalExpr FE EE_B (tail E1) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal Hd VA) O_A *
H1 : is_expr E1
Vars : vars E1 Vars
============================
 VA = VB /\ O_A = O_B
 < EvB: case EvB.

Subgoal 1.29:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1 Hd1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal Hd VA) O_A *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 (consVal Hd1 VB) O_B
============================
 VA = VB /\ O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB Vars _.

Subgoal 1.29:

Variables: FE EE_A EE_B VB O_B Vars E1 Hd1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal Hd1 VB) O_B *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 (consVal Hd1 VB) O_B
============================
 VB = VB /\ O_B = O_B
 < search.

Subgoal 1.30:

Variables: FE EE_A EE_B VB O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) trueVal O_A @
EvB : evalExpr FE EE_B (null E1) VB O_B
Vars : vars (null E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 nilVal O_A *
============================
 trueVal = VB /\ O_A = O_B
 < case IsE.

Subgoal 1.30:

Variables: FE EE_A EE_B VB O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) trueVal O_A @
EvB : evalExpr FE EE_B (null E1) VB O_B
Vars : vars (null E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 nilVal O_A *
H1 : is_expr E1
============================
 trueVal = VB /\ O_A = O_B
 < Vars: case Vars.

Subgoal 1.30:

Variables: FE EE_A EE_B VB O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) trueVal O_A @
EvB : evalExpr FE EE_B (null E1) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 nilVal O_A *
H1 : is_expr E1
Vars : vars E1 Vars
============================
 trueVal = VB /\ O_A = O_B
 < EvB: case EvB.

Subgoal 1.30.1:

Variables: FE EE_A EE_B O_A O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) trueVal O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 nilVal O_A *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 nilVal O_B
============================
 trueVal = trueVal /\ O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB Vars _.

Subgoal 1.30.1:

Variables: FE EE_A EE_B O_B Vars E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) trueVal O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 nilVal O_B *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 nilVal O_B
============================
 trueVal = trueVal /\ O_B = O_B
 < search.

Subgoal 1.30.2:

Variables: FE EE_A EE_B O_A O_B Vars E1 Hd Tl
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) trueVal O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 nilVal O_A *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 (consVal Hd Tl) O_B
============================
 trueVal = falseVal /\ O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB Vars _.

Subgoal 1.31:

Variables: FE EE_A EE_B VB O_A O_B Vars Hd Tl E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) falseVal O_A @
EvB : evalExpr FE EE_B (null E1) VB O_B
Vars : vars (null E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) O_A *
============================
 falseVal = VB /\ O_A = O_B
 < case IsE.

Subgoal 1.31:

Variables: FE EE_A EE_B VB O_A O_B Vars Hd Tl E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) falseVal O_A @
EvB : evalExpr FE EE_B (null E1) VB O_B
Vars : vars (null E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) O_A *
H1 : is_expr E1
============================
 falseVal = VB /\ O_A = O_B
 < Vars: case Vars.

Subgoal 1.31:

Variables: FE EE_A EE_B VB O_A O_B Vars Hd Tl E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) falseVal O_A @
EvB : evalExpr FE EE_B (null E1) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) O_A *
H1 : is_expr E1
Vars : vars E1 Vars
============================
 falseVal = VB /\ O_A = O_B
 < EvB: case EvB.

Subgoal 1.31.1:

Variables: FE EE_A EE_B O_A O_B Vars Hd Tl E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) falseVal O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) O_A *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 nilVal O_B
============================
 falseVal = trueVal /\ O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB Vars _.

Subgoal 1.31.2:

Variables: FE EE_A EE_B O_A O_B Vars Hd Tl E1 Hd1 Tl1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) falseVal O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) O_A *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 (consVal Hd1 Tl1) O_B
============================
 falseVal = falseVal /\ O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB Vars _.

Subgoal 1.31.2:

Variables: FE EE_A EE_B O_B Vars E1 Hd1 Tl1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) falseVal O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 (consVal Hd1 Tl1) O_B *
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 (consVal Hd1 Tl1) O_B
============================
 falseVal = falseVal /\ O_B = O_B
 < search.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB O_A O_B Vars LV O1 Idx O2 I L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
EvB : evalExpr FE EE_B (index L I) VB O_B
Vars : vars (index L I) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV O1 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
============================
 VA = VB /\ O_A = O_B
 < case IsE.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB O_A O_B Vars LV O1 Idx O2 I L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
EvB : evalExpr FE EE_B (index L I) VB O_B
Vars : vars (index L I) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV O1 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
============================
 VA = VB /\ O_A = O_B
 < Vars: case Vars.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB O_A O_B Vars LV O1 Idx O2 I L VL VI
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
EvB : evalExpr FE EE_B (index L I) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV O1 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
============================
 VA = VB /\ O_A = O_B
 < EvB: case EvB.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB O_A O_B Vars LV O1 Idx O2 I L VL VI LV1 O3 Idx1 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV O1 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
============================
 VA = VB /\ O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB Vars _.

Subgoal 1.32.1:

Variables: FE EE_A EE_B VA VB O_A O_B Vars LV O1 Idx O2 I L VL VI LV1 O3 Idx1 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV O1 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
============================
 forall X V, mem X VL -> lookupScopes X EE_B V -> lookupScopes X EE_A V
 < intros M L.

Subgoal 1.32.1:

Variables: FE EE_A EE_B VA VB O_A O_B Vars LV O1 Idx O2 I L VL VI LV1 O3 Idx1 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV O1 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
M : mem X VL
L : lookupScopes X EE_B V
============================
 lookupScopes X EE_A V
 < M': apply mem_append_left to M Vars2.

Subgoal 1.32.1:

Variables: FE EE_A EE_B VA VB O_A O_B Vars LV O1 Idx O2 I L VL VI LV1 O3 Idx1 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV O1 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
M : mem X VL
L : lookupScopes X EE_B V
M' : mem X Vars
============================
 lookupScopes X EE_A V
 < apply Rel to M' L.

Subgoal 1.32.1:

Variables: FE EE_A EE_B VA VB O_A O_B Vars LV O1 Idx O2 I L VL VI LV1 O3 Idx1 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV O1 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
M : mem X VL
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
 lookupScopes X EE_A V
 < search.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Idx O2 I L VL VI LV1 O3 Idx1 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV1 Idx VA
EvA4 : O3 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
============================
 VA = VB /\ O_A = O_B
 < apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.

Subgoal 1.32.2:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Idx O2 I L VL VI LV1 O3 Idx1 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV1 Idx VA
EvA4 : O3 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
============================
 forall X V, mem X VI -> lookupScopes X EE_B V -> lookupScopes X EE_A V
 < intros M L.

Subgoal 1.32.2:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Idx O2 I L VL VI LV1 O3 Idx1 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV1 Idx VA
EvA4 : O3 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
M : mem X VI
L : lookupScopes X EE_B V
============================
 lookupScopes X EE_A V
 < M': apply mem_append_right to M Vars2.

Subgoal 1.32.2:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Idx O2 I L VL VI LV1 O3 Idx1 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV1 Idx VA
EvA4 : O3 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
M : mem X VI
L : lookupScopes X EE_B V
M' : mem X Vars
============================
 lookupScopes X EE_A V
 < apply Rel to M' L.

Subgoal 1.32.2:

Variables: FE EE_A EE_B VA VB O_A O_B Vars Idx O2 I L VL VI LV1 O3 Idx1 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV1 Idx VA
EvA4 : O3 ++ O2 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
M : mem X VI
L : lookupScopes X EE_B V
M' : mem X Vars
H3 : lookupScopes X EE_A V
============================
 lookupScopes X EE_A V
 < search.

Subgoal 1.32:

Variables: FE EE_A EE_B VA VB O_A O_B Vars I L VL VI LV1 O3 Idx1 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx1) O4 *
EvA3 : listIndex LV1 Idx1 VA
EvA4 : O3 ++ O4 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
============================
 VA = VB /\ O_A = O_B
 < apply listIndex_unique to EvA3 EvB2.

Subgoal 1.32:

Variables: FE EE_A EE_B VB O_A O_B Vars I L VL VI LV1 O3 Idx1 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx1) O4 *
EvA3 : listIndex LV1 Idx1 VB
EvA4 : O3 ++ O4 = O_A
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
============================
 VB = VB /\ O_A = O_B
 < apply append_unique to EvA4 EvB3.

Subgoal 1.32:

Variables: FE EE_A EE_B VB O_B Vars I L VL VI LV1 O3 Idx1 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx1) O4 *
EvA3 : listIndex LV1 Idx1 VB
EvA4 : O3 ++ O4 = O_B
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = O_B
============================
 VB = VB /\ O_B = O_B
 < search.

Subgoal 1.33:

Variables: FE EE_A EE_B VB O_A O_B Vars V I E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (looseEval: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 (looseEval:list:length E1) (intVal I) O_A @
EvB : evalExpr FE EE_B (looseEval:list:length E1) VB O_B
Vars : vars (looseEval:list:length E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O_A *
EvA2 : listLength V I
============================
 intVal I = VB /\ O_A = O_B
 < case IsE.

Subgoal 1.33:

Variables: FE EE_A EE_B VB O_A O_B Vars V I E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (looseEval:list:length E1) (intVal I) O_A @
EvB : evalExpr FE EE_B (looseEval:list:length E1) VB O_B
Vars : vars (looseEval:list:length E1) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O_A *
EvA2 : listLength V I
H1 : is_expr E1
============================
 intVal I = VB /\ O_A = O_B
 < Vars: case Vars.

Subgoal 1.33:

Variables: FE EE_A EE_B VB O_A O_B Vars V I E1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (looseEval:list:length E1) (intVal I) O_A @
EvB : evalExpr FE EE_B (looseEval:list:length E1) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O_A *
EvA2 : listLength V I
H1 : is_expr E1
Vars : vars E1 Vars
============================
 intVal I = VB /\ O_A = O_B
 < EvB: case EvB.

Subgoal 1.33:

Variables: FE EE_A EE_B O_A O_B Vars V I E1 V1 I1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (looseEval:list:length E1) (intVal I) O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V O_A *
EvA2 : listLength V I
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 V1 O_B
EvB1 : listLength V1 I1
============================
 intVal I = intVal I1 /\ O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB Vars _.

Subgoal 1.33:

Variables: FE EE_A EE_B O_B Vars I E1 V1 I1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (looseEval:list:length E1) (intVal I) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O_B *
EvA2 : listLength V1 I
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 V1 O_B
EvB1 : listLength V1 I1
============================
 intVal I = intVal I1 /\ O_B = O_B
 < apply listLength_unique to EvA2 EvB1.

Subgoal 1.33:

Variables: FE EE_A EE_B O_B Vars E1 V1 I1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (looseEval:list:length E1) (intVal I1) O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A E1 V1 O_B *
EvA2 : listLength V1 I1
H1 : is_expr E1
Vars : vars E1 Vars
EvB : evalExpr FE EE_B E1 V1 O_B
EvB1 : listLength V1 I1
============================
 intVal I1 = intVal I1 /\ O_B = O_B
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
============================
 O_A = O_B
 < Is: case IsS.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
============================
 O_A = O_B
 < VarsI: apply vars_exist to Is1.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
============================
 O_A = O_B
 < VarsE: apply vars_exist to Is2.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
============================
 O_A = O_B
 < NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).

Subgoal 2.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 O_A = O_B
 < apply IH_E to _ _ _ _ EvA2 EvB1 VarsI _.

Subgoal 2.15.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 forall X V,
   mem X V1 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
 < intros M L.

Subgoal 2.15.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V4
============================
 lookupScopes X (Scope::EE_A) V4
 < apply vars_is to _ VarsI.

Subgoal 2.15.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V1
============================
 lookupScopes X (Scope::EE_A) V4
 < apply mem_is_string to _ M.

Subgoal 2.15.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V1
H2 : is_string X
============================
 lookupScopes X (Scope::EE_A) V4
 < apply newNameScopes_lookupScopes to _ _ NNS' L.

Subgoal 2.15.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V1
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V4
============================
 lookupScopes X (Scope::EE_A) V4
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 O_A = O_B
 < apply IH_E to _ _ _ _ EvA3 EvB2 VarsE _.

Subgoal 2.15.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 forall X V,
   mem X V2 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
 < intros M L.

Subgoal 2.15.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V2
L : lookupScopes X (Scope::EE_B) V4
============================
 lookupScopes X (Scope::EE_A) V4
 < apply vars_is to _ VarsE.

Subgoal 2.15.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V2
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V2
============================
 lookupScopes X (Scope::EE_A) V4
 < apply mem_is_string to _ M.

Subgoal 2.15.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V2
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V2
H2 : is_string X
============================
 lookupScopes X (Scope::EE_A) V4
 < apply newNameScopes_lookupScopes to _ _ NNS' L.

Subgoal 2.15.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V2
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V2
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V4
============================
 lookupScopes X (Scope::EE_A) V4
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V3 O4 *
EvA4 : updateListIndex LV N2 V3 LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O4 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 O_A = O_B
 < apply append_unique to EvA6 EvB5.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope LV LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V3 O4 *
EvA4 : updateListIndex LV N2 V3 LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O4 = O_B
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 O_B = O_B
 < search.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
============================
 O_A = O_B
 < Is: case IsS.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
============================
 O_A = O_B
 < V: apply vars_exist to Is1.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
============================
 O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB V _.

Subgoal 2.16.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
============================
 forall X V1,
   mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
 < intros M LSB.

Subgoal 2.16.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply vars_is to _ V.

Subgoal 2.16.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H1 : is_list is_string V
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply mem_is_string to _ M.

Subgoal 2.16.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply newNameScopes_lookupScopes to _ _ _ LSB.

Subgoal 2.16.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < search.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
============================
 O_A = O_B
 < apply IH_E to _ _ _ _ EvA1 EvB V _.

Subgoal 2.16.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
============================
 forall X V1,
   mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
 < intros M LSB.

Subgoal 2.16.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply vars_is to _ V.

Subgoal 2.16.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H1 : is_list is_string V
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply mem_is_string to _ M.

Subgoal 2.16.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply newNameScopes_lookupScopes to _ _ _ LSB.

Subgoal 2.16.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < search.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
============================
 O_A = O_B
 < apply evalExpr_isValue to _ _ _ EvA1.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
H1 : is_value LV1
============================
 O_A = O_B
 < apply IH_O_IL to _ _ _ _ _ _ EvA2 EvB1 _.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O4 *
EvA3 : O3 ++ O4 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
H1 : is_value LV1
============================
 O_A = O_B
 < apply append_unique to EvA3 EvB2.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O4 *
EvA3 : O3 ++ O4 = O_B
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
H1 : is_value LV1
============================
 O_B = O_B
 < search.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
============================
 newNameScopes N Len EE_A' EE_B'
 < Is: case IsS.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
============================
 newNameScopes N Len EE_A' EE_B'
 < VarsI: apply vars_exist to Is1.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
============================
 newNameScopes N Len EE_A' EE_B'
 < VarsE: apply vars_exist to Is2.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
============================
 newNameScopes N Len EE_A' EE_B'
 < NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_E to _ _ _ _ EvA2 EvB1 VarsI _.

Subgoal 3.15.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 forall X V,
   mem X V1 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
 < intros M L.

Subgoal 3.15.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V4
============================
 lookupScopes X (Scope::EE_A) V4
 < apply vars_is to _ VarsI.

Subgoal 3.15.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V1
============================
 lookupScopes X (Scope::EE_A) V4
 < apply mem_is_string to _ M.

Subgoal 3.15.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V1
H2 : is_string X
============================
 lookupScopes X (Scope::EE_A) V4
 < apply newNameScopes_lookupScopes to _ _ NNS' L.

Subgoal 3.15.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV N1 O1 V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N1) O1 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O1 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V1
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V1
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V4
============================
 lookupScopes X (Scope::EE_A) V4
 < search.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_E to _ _ _ _ EvA3 EvB2 VarsE _.

Subgoal 3.15.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 forall X V,
   mem X V2 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
 < intros M L.

Subgoal 3.15.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V2
L : lookupScopes X (Scope::EE_B) V4
============================
 lookupScopes X (Scope::EE_A) V4
 < apply vars_is to _ VarsE.

Subgoal 3.15.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V2
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V2
============================
 lookupScopes X (Scope::EE_A) V4
 < apply mem_is_string to _ M.

Subgoal 3.15.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V2
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V2
H2 : is_string X
============================
 lookupScopes X (Scope::EE_A) V4
 < apply newNameScopes_lookupScopes to _ _ NNS' L.

Subgoal 3.15.2:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV V O2 LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3 X V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V O2 *
EvA4 : updateListIndex LV N2 V LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O2 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
M : mem X V2
L : lookupScopes X (Scope::EE_B) V4
H1 : is_list is_string V2
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V4
============================
 lookupScopes X (Scope::EE_A) V4
 < search.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V3 O4 *
EvA4 : updateListIndex LV N2 V3 LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O4 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isValue to _ _ _ EvA3.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V3 O4 *
EvA4 : updateListIndex LV N2 V3 LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O4 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_value V3
============================
 newNameScopes N Len EE_A' EE_B'
 < apply lookupScopes_is to _ EvB.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V3 O4 *
EvA4 : updateListIndex LV N2 V3 LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O4 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_value V3
H2 : is_value LV1
H3 : is_string L
============================
 newNameScopes N Len EE_A' EE_B'
 < LA: apply newNameScopes_lookupScopes to _ _ NNS' EvB.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV LV2 E I L V1 V2 LV1 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V3 O4 *
EvA4 : updateListIndex LV N2 V3 LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O4 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV1
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV1 N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_value V3
H2 : is_value LV1
H3 : is_string L
LA : lookupScopes L (Scope::EE_A) LV1
============================
 newNameScopes N Len EE_A' EE_B'
 < apply lookupScopes_unique to LA EvA1.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV LV2 E I L V1 V2 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V3 O4 *
EvA4 : updateListIndex LV N2 V3 LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O4 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_value V3
H2 : is_value LV
H3 : is_string L
LA : lookupScopes L (Scope::EE_A) LV
============================
 newNameScopes N Len EE_A' EE_B'
 < apply updateListIndex_is to _ _ EvB3.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV LV2 E I L V1 V2 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V3 O4 *
EvA4 : updateListIndex LV N2 V3 LV2
EvA5 : replaceScopes L LV2 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O4 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_value V3
H2 : is_value LV
H3 : is_string L
LA : lookupScopes L (Scope::EE_A) LV
H4 : is_value LV3
============================
 newNameScopes N Len EE_A' EE_B'
 < apply updateListIndex_unique to EvA4 EvB3.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV E I L V1 V2 N2 O3 V3 O4 LV3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V3 O4 *
EvA4 : updateListIndex LV N2 V3 LV3
EvA5 : replaceScopes L LV3 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O4 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_value V3
H2 : is_value LV
H3 : is_string L
LA : lookupScopes L (Scope::EE_A) LV
H4 : is_value LV3
============================
 newNameScopes N Len EE_A' EE_B'
 < RSA: apply newNameScopes_replaceScopes to _ _ _ _ NNS' EvB4.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV E I L V1 V2 N2 O3 V3 O4 LV3 RA
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V3 O4 *
EvA4 : updateListIndex LV N2 V3 LV3
EvA5 : replaceScopes L LV3 (Scope::EE_A) EE_A'
EvA6 : O3 ++ O4 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_value V3
H2 : is_value LV
H3 : is_string L
LA : lookupScopes L (Scope::EE_A) LV
H4 : is_value LV3
RSA : replaceScopes L LV3 (Scope::EE_A) RA
RSA1 : newNameScopes N Len RA EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < apply replaceScopes_unique to EvA5 RSA.

Subgoal 3.15:

Variables: FE EE_A EE_B EE_B' O_A O_B N Len Scope LV E I L V1 V2 N2 O3 V3 O4 LV3 RA
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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) RA O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : lookupScopes L (Scope::EE_A) LV
EvA2 : evalExpr FE (Scope::EE_A) I (intVal N2) O3 *
EvA3 : evalExpr FE (Scope::EE_A) E V3 O4 *
EvA4 : updateListIndex LV N2 V3 LV3
EvA5 : replaceScopes L LV3 (Scope::EE_A) RA
EvA6 : O3 ++ O4 = O_A
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
EvB : lookupScopes L (Scope::EE_B) LV
EvB1 : evalExpr FE (Scope::EE_B) I (intVal N2) O3
EvB2 : evalExpr FE (Scope::EE_B) E V3 O4
EvB3 : updateListIndex LV N2 V3 LV3
EvB4 : replaceScopes L LV3 (Scope::EE_B) EE_B'
EvB5 : O3 ++ O4 = O_B
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H1 : is_value V3
H2 : is_value LV
H3 : is_string L
LA : lookupScopes L (Scope::EE_A) LV
H4 : is_value LV3
RSA : replaceScopes L LV3 (Scope::EE_A) RA
RSA1 : newNameScopes N Len RA EE_B'
============================
 newNameScopes N Len RA EE_B'
 < search.

Subgoal 3.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
============================
 newNameScopes N Len EE_A' EE_B'
 < Is: case IsS.

Subgoal 3.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 3.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
============================
 newNameScopes N Len EE_A' EE_B'
 < V: apply vars_exist to Is1.

Subgoal 3.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_E to _ _ _ _ EvA1 EvB V _.

Subgoal 3.16.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
============================
 forall X V1,
   mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
 < intros M LSB.

Subgoal 3.16.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply vars_is to _ V.

Subgoal 3.16.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H1 : is_list is_string V
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply mem_is_string to _ M.

Subgoal 3.16.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply newNameScopes_lookupScopes to _ _ _ LSB.

Subgoal 3.16.1:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 Body L X LV1 O3 O4 V X1 V1
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O1 *
EvA2 : iterateList FE (Scope::EE_A) LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H1 : is_list is_string V
H2 : is_string X1
H3 : lookupScopes X1 (Scope::EE_A) V1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < search.

Subgoal 3.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
============================
 newNameScopes N Len EE_A' EE_B'
 < apply evalExpr_isValue to _ _ _ EvA1.

Subgoal 3.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
H1 : is_value LV1
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_IL to _ _ _ _ _ _ EvA2 EvB1 _.

Subgoal 3.16:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O2 Body L X LV1 O3 O4 V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 O3 *
EvA2 : iterateList FE (Scope::EE_A) LV1 X Body EE_A' O2 *
EvA3 : O3 ++ O2 = O_A
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvB : evalExpr FE (Scope::EE_B) L LV1 O3
EvB1 : iterateList FE (Scope::EE_B) LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = O_B
V : vars L V
H1 : is_value LV1
H2 : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 6.1:

Variables: FE EE_B X Body EE_A' EE_B' O_B N Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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' nilVal X Body EE_A' [] @
ILB : iterateList FE EE_B nilVal X Body EE_B' O_B
NNS : newNameScopes N Len EE_A' EE_B
============================
 [] = O_B
 < case ILB.

Subgoal 6.1:

Variables: FE X Body EE_A' EE_B' N Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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' nilVal X Body EE_A' [] @
NNS : newNameScopes N Len EE_A' EE_B'
============================
 [] = []
 < search.

Subgoal 6.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 (consVal Hd Tl) X Body EE_A' O_A @
ILB : iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
============================
 O_A = O_B
 < case IsV.

Subgoal 6.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
ILB : iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
============================
 O_A = O_B
 < ILB: case ILB.

Subgoal 6.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
============================
 O_A = O_B
 < apply IH_O_S to _ _ _ _ ILA1 ILB _.

Subgoal 6.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
============================
 O_A = O_B
 < NNS+: apply IH_C_S to _ _ _ _ ILA1 ILB _.

Subgoal 6.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len (Scope::EE1) (Scope1::EE2)
============================
 O_A = O_B
 < NNS+: case NNS+.

Subgoal 6.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
 < LenEE_B: apply length_exists_list_pair_string_value to IsB.

Subgoal 6.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
============================
 O_A = O_B
 < IsN2: apply length_is to LenEE_B.

Subgoal 6.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
============================
 O_A = O_B
 < P: apply plus_integer_total to _ IsN2 with
        N1 = 1.

Subgoal 6.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
============================
 O_A = O_B
 < LenEE_B+: assert length ([(X, Hd)]::EE_B) N3.

Subgoal 6.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
LenEE_B+ : length ([(X, Hd)]::EE_B) N3
============================
 O_A = O_B
 < LenEE2+: apply evalStmt_keep_scopes to _ _ _ ILB LenEE_B+.

Subgoal 6.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
LenEE_B+ : length ([(X, Hd)]::EE_B) N3
LenEE2+ : length (Scope1::EE2) N3
============================
 O_A = O_B
 < apply length_unique to LenEE2+ NNS+.

Subgoal 6.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd)]::EE_B) Len
LenEE2+ : length (Scope1::EE2) Len
============================
 O_A = O_B
 < LEq: apply newNameScopes_length to NNS LenEE_B.

Subgoal 6.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd)]::EE_B) Len
LenEE2+ : length (Scope1::EE2) Len
LEq : Len <= N2
============================
 O_A = O_B
 < L: apply lt_plus_one to P _.

Subgoal 6.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd)]::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 6.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
============================
 O_A = O_B
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILA1.

Subgoal 6.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
============================
 O_A = O_B
 < case IsEE1+.

Subgoal 6.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
H3 : is_list (is_pair is_string is_value) Scope1
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 O_A = O_B
 < IsEE2+: apply evalStmt_isCtx to _ _ _ ILB.

Subgoal 6.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
H3 : is_list (is_pair is_string is_value) Scope1
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 6.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
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
============================
 O_A = O_B
 < apply IH_O_IL to _ _ _ _ _ _ ILA2 ILB1 _.

Subgoal 6.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O4 *
ILA3 : O3 ++ O4 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
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
============================
 O_A = O_B
 < apply append_unique to ILA3 ILB2.

Subgoal 6.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_B N Len EE1 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O4 *
ILA3 : O3 ++ O4 = O_B
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
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
============================
 O_B = O_B
 < search.

Subgoal 7.1:

Variables: FE EE_B X Body EE_A' EE_B' O_B N Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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' nilVal X Body EE_A' [] @
ILB : iterateList FE EE_B nilVal X Body EE_B' O_B
NNS : newNameScopes N Len EE_A' EE_B
============================
 newNameScopes N Len EE_A' EE_B'
 < case ILB.

Subgoal 7.1:

Variables: FE X Body EE_A' EE_B' N Len
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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' nilVal X Body EE_A' [] @
NNS : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Subgoal 7.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 (consVal Hd Tl) X Body EE_A' O_A @
ILB : iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsV.

Subgoal 7.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
ILB : iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
============================
 newNameScopes N Len EE_A' EE_B'
 < ILB: case ILB.

Subgoal 7.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
============================
 newNameScopes N Len EE_A' EE_B'
 < NNS+: apply IH_C_S to _ _ _ _ ILA1 ILB _.

Subgoal 7.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len (Scope::EE1) (Scope1::EE2)
============================
 newNameScopes N Len EE_A' EE_B'
 < NNS+: case NNS+.

Subgoal 7.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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'
 < LenEE_B: apply length_exists_list_pair_string_value to IsB.

Subgoal 7.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
============================
 newNameScopes N Len EE_A' EE_B'
 < IsN2: apply length_is to LenEE_B.

Subgoal 7.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : 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 7.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
============================
 newNameScopes N Len EE_A' EE_B'
 < LenEE_B+: assert length ([(X, Hd)]::EE_B) N3.

Subgoal 7.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
LenEE_B+ : length ([(X, Hd)]::EE_B) N3
============================
 newNameScopes N Len EE_A' EE_B'
 < LenEE2+: apply evalStmt_keep_scopes to _ _ _ ILB LenEE_B+.

Subgoal 7.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2 N3
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = N3
LenEE_B+ : length ([(X, Hd)]::EE_B) N3
LenEE2+ : length (Scope1::EE2) N3
============================
 newNameScopes N Len EE_A' EE_B'
 < apply length_unique to LenEE2+ NNS+.

Subgoal 7.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd)]::EE_B) Len
LenEE2+ : length (Scope1::EE2) Len
============================
 newNameScopes N Len EE_A' EE_B'
 < LEq: apply newNameScopes_length to NNS LenEE_B.

Subgoal 7.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd)]::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 7.2.1:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4 N1 SNames BNames N2
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
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
LenEE_B : length EE_B N2
IsN2 : is_integer N2
P : 1 + N2 = Len
LenEE_B+ : length ([(X, Hd)]::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 7.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
============================
 newNameScopes N Len EE_A' EE_B'
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILA1.

Subgoal 7.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope1::EE1)
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsEE1+.

Subgoal 7.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
H3 : is_list (is_pair is_string is_value) Scope1
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 newNameScopes N Len EE_A' EE_B'
 < IsEE2+: apply evalStmt_isCtx to _ _ _ ILB.

Subgoal 7.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
H3 : is_list (is_pair is_string is_value) Scope1
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 7.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
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
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_IL to _ _ _ _ _ _ ILA2 ILB1 _.

Subgoal 7.2.2:

Variables: FE EE_A EE_B X Body EE_A' EE_B' O_A O_B N Len EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalExpr FE EE_A E VA O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         evalArgs FE EE_A A VA O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
         (forall X V,
           mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
         O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          evalRecFields FE EE_A RF VA O_A * -> evalRecFields FE EE_B RF VB O_B ->
          varsRecFields RF Vars -> (forall X V,
            mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
          O_A = O_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 (consVal Hd Tl) X Body EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope1::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = O_A
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = O_B
NNS+ : newNameScopes N Len EE1 EE2
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 : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Proof completed.
 < Prove looseEval:host:evalExpr_rel_exists_ES,
         looseEval:host:evalStmt_newNameScopes_exists_ES,
         looseEval:host:evalArgs_rel_exists_ES,
         looseEval:host:evalRecFields_rel_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.26:

Variables: FE EE_A EE_B Vars Ty
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) nilVal [] 1 @
Vars : vars (nil Ty) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
============================
 <evalExpr {ES}> FE EE_A (nil Ty) nilVal [] 1
 < search.

Subgoal 1.27:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Vars : vars (cons E1 E2) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
============================
 <evalExpr {ES}> FE EE_A (cons E1 E2) (consVal V1 V2) O ES
 < case IsE.

Subgoal 1.27:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Vars : vars (cons E1 E2) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 <evalExpr {ES}> FE EE_A (cons E1 E2) (consVal V1 V2) O ES
 < Vars: case Vars.

Subgoal 1.27:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
============================
 <evalExpr {ES}> FE EE_A (cons E1 E2) (consVal V1 V2) O ES
 < EvA1: apply IH_E to _ _ _ _ EvB3 Vars _ with
           EE_A = EE_A.

Subgoal 1.27.1:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
============================
 forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
 < intros M L.

Subgoal 1.27.1:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
M : mem X V3
L : lookupScopes X EE_B V5
============================
 lookupScopes X EE_A V5
 < M': apply mem_append_left to M Vars2.

Subgoal 1.27.1:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
M : mem X V3
L : lookupScopes X EE_B V5
M' : mem X Vars
============================
 lookupScopes X EE_A V5
 < apply Rel to M' L.

Subgoal 1.27.1:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
M : mem X V3
L : lookupScopes X EE_B V5
M' : mem X Vars
H3 : lookupScopes X EE_A V5
============================
 lookupScopes X EE_A V5
 < search.

Subgoal 1.27:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
============================
 <evalExpr {ES}> FE EE_A (cons E1 E2) (consVal V1 V2) O ES
 < EvA2: apply IH_E to _ _ _ _ EvB4 Vars1 _ with
           EE_A = EE_A.

Subgoal 1.27.2:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
============================
 forall X V1, mem X V4 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
 < intros M L.

Subgoal 1.27.2:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
M : mem X V4
L : lookupScopes X EE_B V5
============================
 lookupScopes X EE_A V5
 < M': apply mem_append_right to M Vars2.

Subgoal 1.27.2:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
M : mem X V4
L : lookupScopes X EE_B V5
M' : mem X Vars
============================
 lookupScopes X EE_A V5
 < apply Rel to M' L.

Subgoal 1.27.2:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1 V3 V4 X V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
M : mem X V4
L : lookupScopes X EE_B V5
M' : mem X Vars
H3 : lookupScopes X EE_A V5
============================
 lookupScopes X EE_A V5
 < search.

Subgoal 1.27:

Variables: FE EE_A EE_B O ES Vars N2 N1 N3 O2 O3 V2 V1 E2 E1 V3 V4
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) (consVal V1 V2) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B E1 V1 O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B E2 V2 O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
Vars : vars E1 V3
Vars1 : vars E2 V4
Vars2 : V3 ++ V4 = Vars
EvA1 : <evalExpr {ES}> FE EE_A E1 V1 O2 N2
EvA2 : <evalExpr {ES}> FE EE_A E2 V2 O3 N1
============================
 <evalExpr {ES}> FE EE_A (cons E1 E2) (consVal V1 V2) O ES
 < search.

Subgoal 1.28:

Variables: FE EE_A EE_B V O ES Vars N1 Tl E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (head E1) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal V Tl) O N1 *
============================
 <evalExpr {ES}> FE EE_A (head E1) V O ES
 < case IsE.

Subgoal 1.28:

Variables: FE EE_A EE_B V O ES Vars N1 Tl E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (head E1) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal V Tl) O N1 *
H1 : is_expr E1
============================
 <evalExpr {ES}> FE EE_A (head E1) V O ES
 < Vars: case Vars.

Subgoal 1.28:

Variables: FE EE_A EE_B V O ES Vars N1 Tl E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal V Tl) O N1 *
H1 : is_expr E1
Vars : vars E1 Vars
============================
 <evalExpr {ES}> FE EE_A (head E1) V O ES
 < apply IH_E to _ _ _ _ EvB2 Vars Rel.

Subgoal 1.28:

Variables: FE EE_A EE_B V O ES Vars N1 Tl E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal V Tl) O N1 *
H1 : is_expr E1
Vars : vars E1 Vars
H2 : <evalExpr {ES}> FE EE_A E1 (consVal V Tl) O N1
============================
 <evalExpr {ES}> FE EE_A (head E1) V O ES
 < search.

Subgoal 1.29:

Variables: FE EE_A EE_B V O ES Vars N1 Hd E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (tail E1) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal Hd V) O N1 *
============================
 <evalExpr {ES}> FE EE_A (tail E1) V O ES
 < case IsE.

Subgoal 1.29:

Variables: FE EE_A EE_B V O ES Vars N1 Hd E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (tail E1) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal Hd V) O N1 *
H1 : is_expr E1
============================
 <evalExpr {ES}> FE EE_A (tail E1) V O ES
 < Vars: case Vars.

Subgoal 1.29:

Variables: FE EE_A EE_B V O ES Vars N1 Hd E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal Hd V) O N1 *
H1 : is_expr E1
Vars : vars E1 Vars
============================
 <evalExpr {ES}> FE EE_A (tail E1) V O ES
 < apply IH_E to _ _ _ _ EvB2 Vars Rel.

Subgoal 1.29:

Variables: FE EE_A EE_B V O ES Vars N1 Hd E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal Hd V) O N1 *
H1 : is_expr E1
Vars : vars E1 Vars
H2 : <evalExpr {ES}> FE EE_A E1 (consVal Hd V) O N1
============================
 <evalExpr {ES}> FE EE_A (tail E1) V O ES
 < search.

Subgoal 1.30:

Variables: FE EE_A EE_B O ES Vars N1 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) trueVal O ES @
Vars : vars (null E1) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 nilVal O N1 *
============================
 <evalExpr {ES}> FE EE_A (null E1) trueVal O ES
 < case IsE.

Subgoal 1.30:

Variables: FE EE_A EE_B O ES Vars N1 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) trueVal O ES @
Vars : vars (null E1) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 nilVal O N1 *
H1 : is_expr E1
============================
 <evalExpr {ES}> FE EE_A (null E1) trueVal O ES
 < Vars: case Vars.

Subgoal 1.30:

Variables: FE EE_A EE_B O ES Vars N1 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) trueVal O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 nilVal O N1 *
H1 : is_expr E1
Vars : vars E1 Vars
============================
 <evalExpr {ES}> FE EE_A (null E1) trueVal O ES
 < apply IH_E to _ _ _ _ EvB2 Vars Rel.

Subgoal 1.30:

Variables: FE EE_A EE_B O ES Vars N1 E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) trueVal O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 nilVal O N1 *
H1 : is_expr E1
Vars : vars E1 Vars
H2 : <evalExpr {ES}> FE EE_A E1 nilVal O N1
============================
 <evalExpr {ES}> FE EE_A (null E1) trueVal O ES
 < search.

Subgoal 1.31:

Variables: FE EE_A EE_B O ES Vars N1 Hd Tl E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) falseVal O ES @
Vars : vars (null E1) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal Hd Tl) O N1 *
============================
 <evalExpr {ES}> FE EE_A (null E1) falseVal O ES
 < case IsE.

Subgoal 1.31:

Variables: FE EE_A EE_B O ES Vars N1 Hd Tl E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) falseVal O ES @
Vars : vars (null E1) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal Hd Tl) O N1 *
H1 : is_expr E1
============================
 <evalExpr {ES}> FE EE_A (null E1) falseVal O ES
 < Vars: case Vars.

Subgoal 1.31:

Variables: FE EE_A EE_B O ES Vars N1 Hd Tl E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) falseVal O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal Hd Tl) O N1 *
H1 : is_expr E1
Vars : vars E1 Vars
============================
 <evalExpr {ES}> FE EE_A (null E1) falseVal O ES
 < apply IH_E to _ _ _ _ EvB2 Vars Rel.

Subgoal 1.31:

Variables: FE EE_A EE_B O ES Vars N1 Hd Tl E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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) falseVal O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 (consVal Hd Tl) O N1 *
H1 : is_expr E1
Vars : vars E1 Vars
H2 : <evalExpr {ES}> FE EE_A E1 (consVal Hd Tl) O N1
============================
 <evalExpr {ES}> FE EE_A (null E1) falseVal O ES
 < search.

Subgoal 1.32:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (index L I) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
============================
 <evalExpr {ES}> FE EE_A (index L I) V O ES
 < case IsE.

Subgoal 1.32:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Vars : vars (index L I) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 <evalExpr {ES}> FE EE_A (index L I) V O ES
 < Vars: case Vars.

Subgoal 1.32:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L VL VI
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
============================
 <evalExpr {ES}> FE EE_A (index L I) V O ES
 < EvA1: apply IH_E to _ _ _ _ EvB3 Vars _ with
           EE_A = EE_A.

Subgoal 1.32.1:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L VL VI
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
============================
 forall X V1, mem X VL -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
 < intros M L.

Subgoal 1.32.1:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L VL VI X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
M : mem X VL
L : lookupScopes X EE_B V1
============================
 lookupScopes X EE_A V1
 < M': apply mem_append_left to M Vars2.

Subgoal 1.32.1:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L VL VI X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
M : mem X VL
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
 lookupScopes X EE_A V1
 < apply Rel to M' L.

Subgoal 1.32.1:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L VL VI X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
M : mem X VL
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
 lookupScopes X EE_A V1
 < search.

Subgoal 1.32:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L VL VI
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvA1 : <evalExpr {ES}> FE EE_A L LV O2 N2
============================
 <evalExpr {ES}> FE EE_A (index L I) V O ES
 < EvA2: apply IH_E to _ _ _ _ EvB4 Vars1 _ with
           EE_A = EE_A.

Subgoal 1.32.2:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L VL VI
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvA1 : <evalExpr {ES}> FE EE_A L LV O2 N2
============================
 forall X V1, mem X VI -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
 < intros M L.

Subgoal 1.32.2:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L VL VI X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvA1 : <evalExpr {ES}> FE EE_A L LV O2 N2
M : mem X VI
L : lookupScopes X EE_B V1
============================
 lookupScopes X EE_A V1
 < M': apply mem_append_right to M Vars2.

Subgoal 1.32.2:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L VL VI X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvA1 : <evalExpr {ES}> FE EE_A L LV O2 N2
M : mem X VI
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
 lookupScopes X EE_A V1
 < apply Rel to M' L.

Subgoal 1.32.2:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L VL VI X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvA1 : <evalExpr {ES}> FE EE_A L LV O2 N2
M : mem X VI
L : lookupScopes X EE_B V1
M' : mem X Vars
H3 : lookupScopes X EE_A V1
============================
 lookupScopes X EE_A V1
 < search.

Subgoal 1.32:

Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 LV O2 Idx O3 I L VL VI
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B L LV O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B I (intVal Idx) O3 N1 *
EvB5 : listIndex LV Idx V
EvB6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
Vars : vars L VL
Vars1 : vars I VI
Vars2 : VL ++ VI = Vars
EvA1 : <evalExpr {ES}> FE EE_A L LV O2 N2
EvA2 : <evalExpr {ES}> FE EE_A I (intVal Idx) O3 N1
============================
 <evalExpr {ES}> FE EE_A (index L I) V O ES
 < search.

Subgoal 1.33:

Variables: FE EE_A EE_B O ES Vars N1 V1 I E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (looseEval: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 (looseEval:list:length E1) (intVal I) O ES @
Vars : vars (looseEval:list:length E1) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O N1 *
EvB3 : listLength V1 I
============================
 <evalExpr {ES}> FE EE_A (looseEval:list:length E1) (intVal I) O ES
 < case IsE.

Subgoal 1.33:

Variables: FE EE_A EE_B O ES Vars N1 V1 I E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (looseEval:list:length E1) (intVal I) O ES @
Vars : vars (looseEval:list:length E1) Vars
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O N1 *
EvB3 : listLength V1 I
H1 : is_expr E1
============================
 <evalExpr {ES}> FE EE_A (looseEval:list:length E1) (intVal I) O ES
 < Vars: case Vars.

Subgoal 1.33:

Variables: FE EE_A EE_B O ES Vars N1 V1 I E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (looseEval:list:length E1) (intVal I) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O N1 *
EvB3 : listLength V1 I
H1 : is_expr E1
Vars : vars E1 Vars
============================
 <evalExpr {ES}> FE EE_A (looseEval:list:length E1) (intVal I) O ES
 < apply IH_E to _ _ _ _ EvB2 Vars Rel.

Subgoal 1.33:

Variables: FE EE_A EE_B O ES Vars N1 V1 I E1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (looseEval:list:length E1) (intVal I) O ES @
Rel : forall X V1,
        mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N1 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V1 O N1 *
EvB3 : listLength V1 I
H1 : is_expr E1
Vars : vars E1 Vars
H2 : <evalExpr {ES}> FE EE_A E1 V1 O N1
============================
 <evalExpr {ES}> FE EE_A (looseEval:list:length E1) (intVal I) O ES
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B).

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < Is: case IsS.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < VarsI: apply vars_exist to Is1.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < VarsE: apply vars_exist to Is2.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply IH_E to _ _ _ _ EvB4 VarsI _ with
     EE_A = Scope::EE_A.

Subgoal 2.15.1:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
============================
 forall X V2,
   mem X V1 -> lookupScopes X (Scope::EE_B) V2 -> lookupScopes X (Scope::EE_A) V2
 < intros M L.

Subgoal 2.15.1:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2 X V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
============================
 lookupScopes X (Scope::EE_A) V3
 < apply vars_is to _ VarsI.

Subgoal 2.15.1:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2 X V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
H1 : is_list is_string V1
============================
 lookupScopes X (Scope::EE_A) V3
 < apply mem_is_string to _ M.

Subgoal 2.15.1:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2 X V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X
============================
 lookupScopes X (Scope::EE_A) V3
 < apply newNameScopes_lookupScopes to _ _ NNS' L.

Subgoal 2.15.1:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2 X V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
M : mem X V1
L : lookupScopes X (Scope::EE_B) V3
H1 : is_list is_string V1
H2 : is_string X
H3 : lookupScopes X (Scope::EE_A) V3
============================
 lookupScopes X (Scope::EE_A) V3
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply IH_E to _ _ _ _ EvB5 VarsE _ with
     EE_A = Scope::EE_A.

Subgoal 2.15.2:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
============================
 forall X V1,
   mem X V2 -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
 < intros M L.

Subgoal 2.15.2:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2 X V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
M : mem X V2
L : lookupScopes X (Scope::EE_B) V3
============================
 lookupScopes X (Scope::EE_A) V3
 < apply vars_is to _ VarsE.

Subgoal 2.15.2:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2 X V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
M : mem X V2
L : lookupScopes X (Scope::EE_B) V3
H2 : is_list is_string V2
============================
 lookupScopes X (Scope::EE_A) V3
 < apply mem_is_string to _ M.

Subgoal 2.15.2:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2 X V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
M : mem X V2
L : lookupScopes X (Scope::EE_B) V3
H2 : is_list is_string V2
H3 : is_string X
============================
 lookupScopes X (Scope::EE_A) V3
 < apply newNameScopes_lookupScopes to _ _ NNS' L.

Subgoal 2.15.2:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2 X V3
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
M : mem X V2
L : lookupScopes X (Scope::EE_B) V3
H2 : is_list is_string V2
H3 : is_string X
H4 : lookupScopes X (Scope::EE_A) V3
============================
 lookupScopes X (Scope::EE_A) V3
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
H2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < Ev': apply drop_ext_size_evalExpr to EvB5.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
H2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2
Ev' : evalExpr FE (Scope::EE_B) E V O3
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply evalExpr_isValue to _ _ _ Ev'.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
H2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2
Ev' : evalExpr FE (Scope::EE_B) E V O3
H3 : is_value V
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply lookupScopes_is to _ EvB3.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
H2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2
Ev' : evalExpr FE (Scope::EE_B) E V O3
H3 : is_value V
H4 : is_value LV
H5 : 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 LV N1 O2 V O3 LV2 E I L V1 V2
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
H2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2
Ev' : evalExpr FE (Scope::EE_B) E V O3
H3 : is_value V
H4 : is_value LV
H5 : is_string L
H6 : is_value LV2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < RA: 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 LV N1 O2 V O3 LV2 E I L V1 V2 RA
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
H2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2
Ev' : evalExpr FE (Scope::EE_B) E V O3
H3 : is_value V
H4 : is_value LV
H5 : is_string L
H6 : is_value LV2
RA : replaceScopes L LV2 (Scope::EE_A) RA
RA1 : newNameScopes N Len RA EE_B'
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
 < apply newNameScopes_lookupScopes to _ _ NNS' EvB3.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV N1 O2 V O3 LV2 E I L V1 V2 RA
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 : lookupScopes L (Scope::EE_B) LV
EvB4 : <evalExpr {ES}> FE (Scope::EE_B) I (intVal N1) O2 N3 *
EvB5 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 *
EvB6 : updateListIndex LV N1 V LV2
EvB7 : replaceScopes L LV2 (Scope::EE_B) EE_B'
EvB8 : O2 ++ O3 = O
NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
VarsI : vars I V1
VarsE : vars E V2
H1 : <evalExpr {ES}> FE (Scope::EE_A) I (intVal N1) O2 N3
H2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2
Ev' : evalExpr FE (Scope::EE_B) E V O3
H3 : is_value V
H4 : is_value LV
H5 : is_string L
H6 : is_value LV2
RA : replaceScopes L LV2 (Scope::EE_A) RA
RA1 : newNameScopes N Len RA EE_B'
H7 : lookupScopes L (Scope::EE_A) LV
============================
 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 O2 O3 Body L X
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) 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
 < Is: case IsS.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV O2 O3 Body L X
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < EvE: 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 O2 O3 Body L X
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvE : evalExpr FE (Scope::EE_B) L LV O2
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < apply evalExpr_isValue to _ _ _ EvE.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV O2 O3 Body L X
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvE : evalExpr FE (Scope::EE_B) L LV O2
H1 : is_value LV
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < V: apply vars_exist to Is1.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV O2 O3 Body L X V
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvE : evalExpr FE (Scope::EE_B) L LV O2
H1 : is_value LV
V : vars L V
============================
 exists EE_A',
   <evalStmt {ES}> FE (Scope::EE_A) (listForeach X L Body) EE_A' O ES
 < apply IH_E to _ _ _ _ EvB3 V _ with
     EE_A = Scope::EE_A.

Subgoal 2.16.1:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV O2 O3 Body L X V
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvE : evalExpr FE (Scope::EE_B) L LV O2
H1 : is_value LV
V : vars L V
============================
 forall X V1,
   mem X V -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
 < intros M LSB.

Subgoal 2.16.1:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV O2 O3 Body L X V X1 V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvE : evalExpr FE (Scope::EE_B) L LV O2
H1 : is_value LV
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply vars_is to _ V.

Subgoal 2.16.1:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV O2 O3 Body L X V X1 V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvE : evalExpr FE (Scope::EE_B) L LV O2
H1 : is_value LV
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H2 : is_list is_string V
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply mem_is_string to _ M.

Subgoal 2.16.1:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV O2 O3 Body L X V X1 V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvE : evalExpr FE (Scope::EE_B) L LV O2
H1 : is_value LV
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H2 : is_list is_string V
H3 : is_string X1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < apply newNameScopes_lookupScopes to _ _ _ LSB.

Subgoal 2.16.1:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV O2 O3 Body L X V X1 V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvE : evalExpr FE (Scope::EE_B) L LV O2
H1 : is_value LV
V : vars L V
M : mem X1 V
LSB : lookupScopes X1 (Scope::EE_B) V1
H2 : is_list is_string V
H3 : is_string X1
H4 : lookupScopes X1 (Scope::EE_A) V1
============================
 lookupScopes X1 (Scope::EE_A) V1
 < search.

Subgoal 2.16:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV O2 O3 Body L X V
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvE : evalExpr FE (Scope::EE_B) L LV O2
H1 : is_value LV
V : vars L V
H2 : <evalExpr {ES}> FE (Scope::EE_A) L LV O2 N2
============================
 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 O2 O3 Body L X V
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvE : evalExpr FE (Scope::EE_B) L LV O2
H1 : is_value LV
V : vars L V
H2 : <evalExpr {ES}> FE (Scope::EE_A) L LV O2 N2
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
 < 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 O2 O3 Body L X V EE_A'
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 O2 N2 *
EvB4 : <iterateList {ES}> FE (Scope::EE_B) LV X Body EE_B' O3 N3 *
EvB5 : O2 ++ O3 = O
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
EvE : evalExpr FE (Scope::EE_B) L LV O2
H1 : is_value LV
V : vars L V
H2 : <evalExpr {ES}> FE (Scope::EE_A) L LV O2 N2
NNS+ : newNameScopes N Len (Scope::EE_A) (Scope::EE_B)
H3 : <iterateList {ES}> FE (Scope::EE_A) LV X Body EE_A' 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
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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' nilVal X Body EE_B' [] 0 @
NNS : newNameScopes N Len EE_A EE_B'
============================
 exists EE_A', <iterateList {ES}> FE EE_A nilVal 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 Scope EE1 O2 O3 Tl Hd
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) 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 Scope EE1 O2 O3 Tl Hd
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < EvA: apply IH_S to _ _ _ _ ILB2 NNS.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd EE_A'
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < EvB': apply drop_ext_size_evalStmt to ILB2.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd EE_A'
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < EvA': apply drop_ext_size_evalStmt to EvA.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd EE_A'
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < IsEE1+: apply evalStmt_isCtx to _ _ _ EvB'.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd EE_A'
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : evalStmt FE ([(X, Hd)]::EE_A) Body EE_A' O2
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) 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 Scope EE1 O2 O3 Tl Hd EE_A'
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < NNS+: apply evalStmt_newNameScopes to _ _ _ _ EvA' EvB' NNS.

Subgoal 5.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd EE_A'
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
NNS+ : newNameScopes N Len EE_A' (Scope::EE1)
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) 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 Scope EE1 O2 O3 Tl Hd EE_A' N1 SNames BNames
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
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 (consVal Hd Tl) X Body EE_A' O ES
 < LenEE_B: 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 Scope EE1 O2 O3 Tl Hd EE_A' N1 SNames BNames N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
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
LenEE_B : length EE_B N4
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < IsN2: apply length_is to LenEE_B.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd EE_A' N1 SNames BNames N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
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
LenEE_B : length EE_B N4
IsN2 : is_integer N4
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < P: apply plus_integer_total to _ IsN2 with
        N1 = 1.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd EE_A' N1 SNames BNames N4 N5
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
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
LenEE_B : length EE_B N4
IsN2 : is_integer N4
P : 1 + N4 = N5
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) 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 Scope EE1 O2 O3 Tl Hd EE_A' N1 SNames BNames N4 N5
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
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
LenEE_B : length EE_B N4
IsN2 : is_integer N4
P : 1 + N4 = N5
LenEE_B+ : length ([(X, Hd)]::EE_B) N5
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < LenEE2+: apply evalStmt_keep_scopes to _ _ _ EvB' LenEE_B+.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd EE_A' N1 SNames BNames N4 N5
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
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
LenEE_B : length EE_B N4
IsN2 : 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 (consVal Hd Tl) 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 Scope EE1 O2 O3 Tl Hd EE_A' N1 SNames BNames N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
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
LenEE_B : length EE_B N4
IsN2 : 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 (consVal Hd Tl) X Body EE_A' O ES
 < LEq: apply newNameScopes_length to NNS LenEE_B.

Subgoal 5.2.1:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd EE_A' N1 SNames BNames N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
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
LenEE_B : length EE_B N4
IsN2 : 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 (consVal Hd Tl) 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 Scope EE1 O2 O3 Tl Hd EE_A' N1 SNames BNames N4
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body EE_A' O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
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
LenEE_B : length EE_B N4
IsN2 : 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 (consVal Hd Tl) 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 Scope EE1 O2 O3 Tl Hd AR
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
NNS+ : newNameScopes N Len AR EE1
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < IsAR+: apply evalStmt_isCtx to _ _ _ EvA'.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd AR
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
NNS+ : newNameScopes N Len AR EE1
IsAR+ : is_list (is_list (is_pair is_string is_value)) (Scope::AR)
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < case IsAR+.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd AR
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
NNS+ : newNameScopes N Len AR EE1
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) AR
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < apply IH_IL to _ _ _ _ _ _ ILB3 NNS+.

Subgoal 5.2.2:

Variables: FE EE_A EE_B X Body EE_B' O N Len ES N2 N3 Scope EE1 O2 O3 Tl Hd AR EE_A'1
IH_E : forall FE EE_A EE_B E V O ES Vars,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> vars E Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_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 O ES * -> varsArgs A Vars -> (forall X V1,
           mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_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 O ES * -> varsRecFields RF Vars -> (forall X V1,
            mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (consVal Hd Tl) X Body EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
ILB1 : N2 + N3 = ES
ILB2 : <evalStmt {ES}> FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2 N2 *
ILB3 : <iterateList {ES}> FE EE1 Tl X Body EE_B' O3 N3 *
ILB4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
EvA : <evalStmt {ES}> FE ([(X, Hd)]::EE_A) Body (Scope::AR) O2 N2
EvB' : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope::EE1) O2
EvA' : 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
NNS+ : newNameScopes N Len AR EE1
H5 : is_list (is_pair is_string is_value) Scope
H6 : is_list (is_list (is_pair is_string is_value)) AR
H7 : <iterateList {ES}> FE AR Tl X Body EE_A'1 O3 N3
============================
 exists EE_A', <iterateList {ES}> FE EE_A (consVal Hd Tl) X Body EE_A' O ES
 < search.

Proof completed.
 < Prove looseEval:host:evalExpr_scopes_same,
         looseEval:host:evalStmt_scopes_same,
         looseEval:host:evalStmt_scopes_same_ctx,
         looseEval:host:evalArgs_scopes_same,
         looseEval:host:evalRecFields_scopes_same
   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.26:

Variables: FE EE_A EE_B VB OB Ty
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) nilVal [] @
EvB : evalExpr FE EE_B (nil Ty) VB OB
============================
 nilVal = VB /\ [] = OB
 < case EvB.

Subgoal 1.26:

Variables: FE EE_A EE_B Ty
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) nilVal [] @
============================
 nilVal = nilVal /\ [] = []
 < search.

Subgoal 1.27:

Variables: FE EE_A OA EE_B VB OB O1 O2 V2 V1 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) (consVal V1 V2) OA @
EvB : evalExpr FE EE_B (cons E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O1 ++ O2 = OA
============================
 consVal V1 V2 = VB /\ OA = OB
 < case IsE.

Subgoal 1.27:

Variables: FE EE_A OA EE_B VB OB O1 O2 V2 V1 E2 E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) (consVal V1 V2) OA @
EvB : evalExpr FE EE_B (cons E1 E2) VB OB
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
============================
 consVal V1 V2 = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.27:

Variables: FE EE_A OA EE_B OB O1 O2 V2 V1 E2 E1 O3 O4 V4 V3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) (consVal V1 V2) OA @
EvA1 : evalExpr FE EE_A E1 V1 O1 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : O3 ++ O4 = OB
============================
 consVal V1 V2 = consVal V3 V4 /\ OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 1.27:

Variables: FE EE_A OA EE_B OB O2 V2 E2 E1 O3 O4 V4 V3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) (consVal V3 V2) OA @
EvA1 : evalExpr FE EE_A E1 V3 O3 *
EvA2 : evalExpr FE EE_A E2 V2 O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : O3 ++ O4 = OB
============================
 consVal V3 V2 = consVal V3 V4 /\ OA = OB
 < apply IH_E to _ _ _ _ _ EvA2 EvB1.

Subgoal 1.27:

Variables: FE EE_A OA EE_B OB E2 E1 O3 O4 V4 V3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) (consVal V3 V4) OA @
EvA1 : evalExpr FE EE_A E1 V3 O3 *
EvA2 : evalExpr FE EE_A E2 V4 O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : O3 ++ O4 = OB
============================
 consVal V3 V4 = consVal V3 V4 /\ OA = OB
 < apply append_unique to EvA3 EvB2.

Subgoal 1.27:

Variables: FE EE_A EE_B OB E2 E1 O3 O4 V4 V3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) (consVal V3 V4) OB @
EvA1 : evalExpr FE EE_A E1 V3 O3 *
EvA2 : evalExpr FE EE_A E2 V4 O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_expr E1
H2 : is_expr E2
EvB : evalExpr FE EE_B E1 V3 O3
EvB1 : evalExpr FE EE_B E2 V4 O4
EvB2 : O3 ++ O4 = OB
============================
 consVal V3 V4 = consVal V3 V4 /\ OB = OB
 < search.

Subgoal 1.28:

Variables: FE EE_A VA OA EE_B VB OB Tl E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (head E1) VB OB
EvA1 : evalExpr FE EE_A E1 (consVal VA Tl) OA *
============================
 VA = VB /\ OA = OB
 < case IsE.

Subgoal 1.28:

Variables: FE EE_A VA OA EE_B VB OB Tl E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (head E1) VB OB
EvA1 : evalExpr FE EE_A E1 (consVal VA Tl) OA *
H1 : is_expr E1
============================
 VA = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.28:

Variables: FE EE_A VA OA EE_B VB OB Tl E1 Tl1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OA @
EvA1 : evalExpr FE EE_A E1 (consVal VA Tl) OA *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (consVal VB Tl1) OB
============================
 VA = VB /\ OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 1.28:

Variables: FE EE_A EE_B VB OB E1 Tl1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OB @
EvA1 : evalExpr FE EE_A E1 (consVal VB Tl1) OB *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (consVal VB Tl1) OB
============================
 VB = VB /\ OB = OB
 < search.

Subgoal 1.29:

Variables: FE EE_A VA OA EE_B VB OB Hd E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (tail E1) VB OB
EvA1 : evalExpr FE EE_A E1 (consVal Hd VA) OA *
============================
 VA = VB /\ OA = OB
 < case IsE.

Subgoal 1.29:

Variables: FE EE_A VA OA EE_B VB OB Hd E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (tail E1) VB OB
EvA1 : evalExpr FE EE_A E1 (consVal Hd VA) OA *
H1 : is_expr E1
============================
 VA = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.29:

Variables: FE EE_A VA OA EE_B VB OB Hd E1 Hd1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OA @
EvA1 : evalExpr FE EE_A E1 (consVal Hd VA) OA *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (consVal Hd1 VB) OB
============================
 VA = VB /\ OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 1.29:

Variables: FE EE_A EE_B VB OB E1 Hd1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OB @
EvA1 : evalExpr FE EE_A E1 (consVal Hd1 VB) OB *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (consVal Hd1 VB) OB
============================
 VB = VB /\ OB = OB
 < search.

Subgoal 1.30:

Variables: FE EE_A OA EE_B VB OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) trueVal OA @
EvB : evalExpr FE EE_B (null E1) VB OB
EvA1 : evalExpr FE EE_A E1 nilVal OA *
============================
 trueVal = VB /\ OA = OB
 < case IsE.

Subgoal 1.30:

Variables: FE EE_A OA EE_B VB OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) trueVal OA @
EvB : evalExpr FE EE_B (null E1) VB OB
EvA1 : evalExpr FE EE_A E1 nilVal OA *
H1 : is_expr E1
============================
 trueVal = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.30.1:

Variables: FE EE_A OA EE_B OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) trueVal OA @
EvA1 : evalExpr FE EE_A E1 nilVal OA *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 nilVal OB
============================
 trueVal = trueVal /\ OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 1.30.1:

Variables: FE EE_A EE_B OB E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) trueVal OB @
EvA1 : evalExpr FE EE_A E1 nilVal OB *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 nilVal OB
============================
 trueVal = trueVal /\ OB = OB
 < search.

Subgoal 1.30.2:

Variables: FE EE_A OA EE_B OB E1 Hd Tl
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) trueVal OA @
EvA1 : evalExpr FE EE_A E1 nilVal OA *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (consVal Hd Tl) OB
============================
 trueVal = falseVal /\ OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 1.31:

Variables: FE EE_A OA EE_B VB OB Hd Tl E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) falseVal OA @
EvB : evalExpr FE EE_B (null E1) VB OB
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) OA *
============================
 falseVal = VB /\ OA = OB
 < case IsE.

Subgoal 1.31:

Variables: FE EE_A OA EE_B VB OB Hd Tl E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) falseVal OA @
EvB : evalExpr FE EE_B (null E1) VB OB
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) OA *
H1 : is_expr E1
============================
 falseVal = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.31.1:

Variables: FE EE_A OA EE_B OB Hd Tl E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) falseVal OA @
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) OA *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 nilVal OB
============================
 falseVal = trueVal /\ OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 1.31.2:

Variables: FE EE_A OA EE_B OB Hd Tl E1 Hd1 Tl1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) falseVal OA @
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) OA *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (consVal Hd1 Tl1) OB
============================
 falseVal = falseVal /\ OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 1.31.2:

Variables: FE EE_A EE_B OB E1 Hd1 Tl1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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) falseVal OB @
EvA1 : evalExpr FE EE_A E1 (consVal Hd1 Tl1) OB *
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 (consVal Hd1 Tl1) OB
============================
 falseVal = falseVal /\ OB = OB
 < search.

Subgoal 1.32:

Variables: FE EE_A VA OA EE_B VB OB LV O1 Idx O2 I L
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (index L I) VB OB
EvA1 : evalExpr FE EE_A L LV O1 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O2 *
EvA3 : listIndex LV Idx VA
EvA4 : O1 ++ O2 = OA
============================
 VA = VB /\ OA = OB
 < case IsE.

Subgoal 1.32:

Variables: FE EE_A VA OA EE_B VB OB LV O1 Idx O2 I L
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OA @
EvB : evalExpr FE EE_B (index L I) VB OB
EvA1 : evalExpr FE EE_A L LV O1 *
EvA2 : evalExpr FE EE_A I (intVal Idx) 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 OA EE_B VB OB LV O1 Idx O2 I L LV1 O3 Idx1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OA @
EvA1 : evalExpr FE EE_A L LV O1 *
EvA2 : evalExpr FE EE_A I (intVal Idx) 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 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
============================
 VA = VB /\ OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 1.32:

Variables: FE EE_A VA OA EE_B VB OB Idx O2 I L LV1 O3 Idx1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OA @
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx) 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 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
============================
 VA = VB /\ OA = OB
 < apply IH_E to _ _ _ _ _ EvA2 EvB1.

Subgoal 1.32:

Variables: FE EE_A VA OA EE_B VB OB I L LV1 O3 Idx1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OA @
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx1) 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 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
============================
 VA = VB /\ OA = OB
 < apply append_unique to EvA4 EvB3.

Subgoal 1.32:

Variables: FE EE_A VA EE_B VB OB I L LV1 O3 Idx1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OB @
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx1) O4 *
EvA3 : listIndex LV1 Idx1 VA
EvA4 : O3 ++ O4 = OB
H1 : is_expr L
H2 : is_expr I
EvB : evalExpr FE EE_B L LV1 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
============================
 VA = VB /\ OB = OB
 < apply listIndex_unique to EvA3 EvB2.

Subgoal 1.32:

Variables: FE EE_A EE_B VB OB I L LV1 O3 Idx1 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 OB @
EvA1 : evalExpr FE EE_A L LV1 O3 *
EvA2 : evalExpr FE EE_A I (intVal Idx1) 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 O3
EvB1 : evalExpr FE EE_B I (intVal Idx1) O4
EvB2 : listIndex LV1 Idx1 VB
EvB3 : O3 ++ O4 = OB
============================
 VB = VB /\ OB = OB
 < search.

Subgoal 1.33:

Variables: FE EE_A OA EE_B VB OB V I E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (looseEval: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 (looseEval:list:length E1) (intVal I) OA @
EvB : evalExpr FE EE_B (looseEval:list:length E1) VB OB
EvA1 : evalExpr FE EE_A E1 V OA *
EvA2 : listLength V I
============================
 intVal I = VB /\ OA = OB
 < case IsE.

Subgoal 1.33:

Variables: FE EE_A OA EE_B VB OB V I E1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (looseEval:list:length E1) (intVal I) OA @
EvB : evalExpr FE EE_B (looseEval:list:length E1) VB OB
EvA1 : evalExpr FE EE_A E1 V OA *
EvA2 : listLength V I
H1 : is_expr E1
============================
 intVal I = VB /\ OA = OB
 < EvB: case EvB.

Subgoal 1.33:

Variables: FE EE_A OA EE_B OB V I E1 V1 I1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (looseEval:list:length E1) (intVal I) OA @
EvA1 : evalExpr FE EE_A E1 V OA *
EvA2 : listLength V I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 OB
EvB1 : listLength V1 I1
============================
 intVal I = intVal I1 /\ OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 1.33:

Variables: FE EE_A EE_B OB I E1 V1 I1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (looseEval:list:length E1) (intVal I) OB @
EvA1 : evalExpr FE EE_A E1 V1 OB *
EvA2 : listLength V1 I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 OB
EvB1 : listLength V1 I1
============================
 intVal I = intVal I1 /\ OB = OB
 < apply listLength_unique to EvB1 EvA2.

Subgoal 1.33:

Variables: FE EE_A EE_B OB I E1 V1
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (looseEval:list:length E1) (intVal I) OB @
EvA1 : evalExpr FE EE_A E1 V1 OB *
EvA2 : listLength V1 I
H1 : is_expr E1
EvB : evalExpr FE EE_B E1 V1 OB
EvB1 : listLength V1 I
============================
 intVal I = intVal I /\ OB = OB
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV N O1 V O2 LV2 E I L
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O1 *
EvA3 : evalExpr FE EE_A E V O2 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsS.

Subgoal 2.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV N O1 V O2 LV2 E I L
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O1 *
EvA3 : evalExpr FE EE_A E V O2 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O1 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 OA = OB
 < EvB: case EvB.

Subgoal 2.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV N O1 V O2 LV2 E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O1 *
EvA3 : evalExpr FE EE_A E V O2 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O1 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ SS EvA2 EvB1.

Subgoal 2.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV V O2 LV2 E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N1) O3 *
EvA3 : evalExpr FE EE_A E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O3 ++ O2 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ SS EvA3 EvB2.

Subgoal 2.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV LV2 E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N1) O3 *
EvA3 : evalExpr FE EE_A E V1 O4 *
EvA4 : updateListIndex LV N1 V1 LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O3 ++ O4 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
============================
 OA = OB
 < apply scopes_same_lookupScopes to _ _ SS EvA1 EvB.

Subgoal 2.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV2 E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV1
EvA2 : evalExpr FE EE_A I (intVal N1) O3 *
EvA3 : evalExpr FE EE_A E V1 O4 *
EvA4 : updateListIndex LV1 N1 V1 LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O3 ++ O4 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
============================
 OA = OB
 < apply updateListIndex_unique to EvA4 EvB3.

Subgoal 2.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV1
EvA2 : evalExpr FE EE_A I (intVal N1) O3 *
EvA3 : evalExpr FE EE_A E V1 O4 *
EvA4 : updateListIndex LV1 N1 V1 LV3
EvA5 : replaceScopes L LV3 EE_A EE_A'
EvA6 : O3 ++ O4 = OA
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
============================
 OA = OB
 < apply append_unique to EvA6 EvB5.

Subgoal 2.15:

Variables: FE EE_A EE_A' EE_B EE_B' OB E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV1
EvA2 : evalExpr FE EE_A I (intVal N1) O3 *
EvA3 : evalExpr FE EE_A E V1 O4 *
EvA4 : updateListIndex LV1 N1 V1 LV3
EvA5 : replaceScopes L LV3 EE_A EE_A'
EvA6 : O3 ++ O4 = OB
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
============================
 OB = OB
 < search.

Subgoal 2.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV O1 O2 Body L X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O1 *
EvA2 : iterateList FE EE_A LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsS.

Subgoal 2.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV O1 O2 Body L X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O1 *
EvA2 : iterateList FE EE_A 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 2.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV O1 O2 Body L X LV1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O1 *
EvA2 : iterateList FE EE_A 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 O3
EvB1 : iterateList FE EE_B LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 2.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB O2 Body L X LV1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O3 *
EvA2 : iterateList FE EE_A 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 O3
EvB1 : iterateList FE EE_B LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply evalExpr_isValue to _ _ _ EvA1.

Subgoal 2.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB O2 Body L X LV1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O3 *
EvA2 : iterateList FE EE_A 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 O3
EvB1 : iterateList FE EE_B LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : is_value LV1
============================
 OA = OB
 < apply IH_IL to _ _ _ _ _ _ SS EvA2 EvB1.

Subgoal 2.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB Body L X LV1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O3 *
EvA2 : iterateList FE EE_A 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 O3
EvB1 : iterateList FE EE_B LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : is_value LV1
============================
 OA = OB
 < apply append_unique to EvA3 EvB2.

Subgoal 2.16:

Variables: FE EE_A EE_A' EE_B EE_B' OB Body L X LV1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O3 *
EvA2 : iterateList FE EE_A 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 O3
EvB1 : iterateList FE EE_B LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : is_value LV1
============================
 OB = OB
 < search.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV N O1 V O2 LV2 E I L
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O1 *
EvA3 : evalExpr FE EE_A E V O2 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O1 ++ O2 = OA
============================
 scopes_same EE_A' EE_B'
 < EvB: case EvB.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV N O1 V O2 LV2 E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 @
EvA1 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O1 *
EvA3 : evalExpr FE EE_A E V O2 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O1 ++ O2 = OA
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < case IsS.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV N O1 V O2 LV2 E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O1 *
EvA3 : evalExpr FE EE_A E V O2 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O1 ++ O2 = OA
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 scopes_same EE_A' EE_B'
 < apply IH_E to _ _ _ _ _ EvA2 EvB1.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV V O2 LV2 E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N1) O3 *
EvA3 : evalExpr FE EE_A E V O2 *
EvA4 : updateListIndex LV N1 V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O3 ++ O2 = OA
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 scopes_same EE_A' EE_B'
 < apply IH_E to _ _ _ _ _ EvA3 EvB2.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV LV2 E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N1) O3 *
EvA3 : evalExpr FE EE_A E V1 O4 *
EvA4 : updateListIndex LV N1 V1 LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O3 ++ O4 = OA
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 scopes_same EE_A' EE_B'
 < apply scopes_same_lookupScopes to _ _ _ EvA1 EvB.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV2 E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV1
EvA2 : evalExpr FE EE_A I (intVal N1) O3 *
EvA3 : evalExpr FE EE_A E V1 O4 *
EvA4 : updateListIndex LV1 N1 V1 LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O3 ++ O4 = OA
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isValue to _ _ _ EvA3.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV2 E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV1
EvA2 : evalExpr FE EE_A I (intVal N1) O3 *
EvA3 : evalExpr FE EE_A E V1 O4 *
EvA4 : updateListIndex LV1 N1 V1 LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O3 ++ O4 = OA
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_value V1
============================
 scopes_same EE_A' EE_B'
 < apply updateListIndex_unique to EvA4 EvB3.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV1
EvA2 : evalExpr FE EE_A I (intVal N1) O3 *
EvA3 : evalExpr FE EE_A E V1 O4 *
EvA4 : updateListIndex LV1 N1 V1 LV3
EvA5 : replaceScopes L LV3 EE_A EE_A'
EvA6 : O3 ++ O4 = OA
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_value V1
============================
 scopes_same EE_A' EE_B'
 < apply scopes_same_replaceScopes_scopes_same to _ _ _ _ EvA5 EvB4.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB E I L LV1 N1 O3 V1 O4 LV3
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 : lookupScopes L EE_A LV1
EvA2 : evalExpr FE EE_A I (intVal N1) O3 *
EvA3 : evalExpr FE EE_A E V1 O4 *
EvA4 : updateListIndex LV1 N1 V1 LV3
EvA5 : replaceScopes L LV3 EE_A EE_A'
EvA6 : O3 ++ O4 = OA
EvB : lookupScopes L EE_B LV1
EvB1 : evalExpr FE EE_B I (intVal N1) O3
EvB2 : evalExpr FE EE_B E V1 O4
EvB3 : updateListIndex LV1 N1 V1 LV3
EvB4 : replaceScopes L LV3 EE_B EE_B'
EvB5 : O3 ++ O4 = OB
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : is_value V1
H5 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV O1 O2 Body L X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O1 *
EvA2 : iterateList FE EE_A LV X Body EE_A' O2 *
EvA3 : O1 ++ O2 = OA
============================
 scopes_same EE_A' EE_B'
 < case IsS.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV O1 O2 Body L X
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O1 *
EvA2 : iterateList FE EE_A 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 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV O1 O2 Body L X LV1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O1 *
EvA2 : iterateList FE EE_A 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 O3
EvB1 : iterateList FE EE_B LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < apply IH_E to _ _ _ _ _ EvA1 EvB.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB O2 Body L X LV1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O3 *
EvA2 : iterateList FE EE_A 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 O3
EvB1 : iterateList FE EE_B LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < apply evalExpr_isValue to _ _ _ EvA1.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB O2 Body L X LV1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O3 *
EvA2 : iterateList FE EE_A 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 O3
EvB1 : iterateList FE EE_B LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : is_value LV1
============================
 scopes_same EE_A' EE_B'
 < apply IH_IL_C to _ _ _ _ _ _ SS EvA2 EvB1.

Subgoal 3.16:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB O2 Body L X LV1 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 O3 *
EvA2 : iterateList FE EE_A 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 O3
EvB1 : iterateList FE EE_B LV1 X Body EE_B' O4
EvB2 : O3 ++ O4 = OB
H4 : is_value LV1
H5 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 6.1:

Variables: X Body FE EE_A' EE_B EE_B' OB
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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' nilVal X Body EE_A' [] @
ILB : iterateList FE EE_B nilVal X Body EE_B' OB
============================
 [] = OB
 < case ILB.

Subgoal 6.1:

Variables: X Body FE EE_A' EE_B'
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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' nilVal X Body EE_A' [] @
============================
 [] = []
 < search.

Subgoal 6.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 (consVal Hd Tl) X Body EE_A' OA @
ILB : iterateList FE EE_B (consVal Hd Tl) X Body EE_B' OB
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
============================
 OA = OB
 < case IsV.

Subgoal 6.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILB : iterateList FE EE_B (consVal Hd Tl) X Body EE_B' OB
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
============================
 OA = OB
 < ILB: case ILB.

Subgoal 6.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
============================
 OA = OB
 < apply IH_S to _ _ _ _ _ ILA1 ILB.

Subgoal 6.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
============================
 OA = OB
 < SS+: apply IH_S_C to _ _ _ _ _ ILA1 ILB.

Subgoal 6.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
SS+ : scopes_same (Scope::EE1) (Scope1::EE2)
============================
 OA = OB
 < case SS+.

Subgoal 6.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
============================
 OA = OB
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILA1.

Subgoal 6.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 OA = OB
 < case IsEE1+.

Subgoal 6.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 OA = OB
 < IsEE2+: apply evalStmt_isCtx to _ _ _ ILB.

Subgoal 6.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
H6 : is_list (is_pair is_string is_value) Scope
H7 : 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 6.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O3 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope1
H9 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 OA = OB
 < apply IH_IL to _ _ _ _ _ _ _ ILA2 ILB1.

Subgoal 6.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O4 *
ILA3 : O3 ++ O4 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope1
H9 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 OA = OB
 < apply append_unique to ILA3 ILB2.

Subgoal 6.2:

Variables: X Body FE EE_A EE_A' EE_B EE_B' OB Scope EE1 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OB @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O3 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O4 *
ILA3 : O3 ++ O4 = OB
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope1
H9 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 OB = OB
 < search.

Subgoal 7.1:

Variables: X Body FE EE_A' EE_B EE_B' OB
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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' nilVal X Body EE_A' [] @
ILB : iterateList FE EE_B nilVal X Body EE_B' OB
============================
 scopes_same EE_A' EE_B'
 < case ILB.

Subgoal 7.1:

Variables: X Body FE EE_A' EE_B'
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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' nilVal X Body EE_A' [] @
============================
 scopes_same EE_A' EE_B'
 < search.

Subgoal 7.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 (consVal Hd Tl) X Body EE_A' OA @
ILB : iterateList FE EE_B (consVal Hd Tl) X Body EE_B' OB
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
============================
 scopes_same EE_A' EE_B'
 < case IsV.

Subgoal 7.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILB : iterateList FE EE_B (consVal Hd Tl) X Body EE_B' OB
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
============================
 scopes_same EE_A' EE_B'
 < ILB: case ILB.

Subgoal 7.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
============================
 scopes_same EE_A' EE_B'
 < SS+: apply IH_S_C to _ _ _ _ _ ILA1 ILB.

Subgoal 7.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
SS+ : scopes_same (Scope::EE1) (Scope1::EE2)
============================
 scopes_same EE_A' EE_B'
 < case SS+.

Subgoal 7.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
============================
 scopes_same EE_A' EE_B'
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILA1.

Subgoal 7.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : 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 7.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 scopes_same EE_A' EE_B'
 < IsEE2+: apply evalStmt_isCtx to _ _ _ ILB.

Subgoal 7.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
H6 : is_list (is_pair is_string is_value) Scope
H7 : 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 7.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope1
H9 : is_list (is_list (is_pair is_string is_value)) EE2
============================
 scopes_same EE_A' EE_B'
 < apply IH_IL_C to _ _ _ _ _ _ _ ILA2 ILB1.

Subgoal 7.2:

Variables: X Body FE EE_A EE_A' OA EE_B EE_B' OB Scope EE1 O1 O2 Tl Hd Scope1 EE2 O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA OA * -> evalExpr FE EE_B E VB OB ->
         VA = VB /\ OA = OB
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 OA EE_B VB OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA OA * -> evalArgs FE EE_B A VB OB ->
         VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA OA * -> evalRecFields FE EE_B RF VB OB ->
          VA = VB /\ OA = OB
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 (consVal Hd Tl) X Body EE_A' OA @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O1 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O2 *
ILA3 : O1 ++ O2 = OA
H1 : is_value Hd
H2 : is_value Tl
ILB : evalStmt FE ([(X, Hd)]::EE_B) Body (Scope1::EE2) O3
ILB1 : iterateList FE EE2 Tl X Body EE_B' O4
ILB2 : O3 ++ O4 = OB
H3 : forall X V, lookup Scope X V -> lookup Scope1 X V
H4 : forall X V, lookup Scope1 X V -> lookup Scope X V
H5 : scopes_same EE1 EE2
H6 : is_list (is_pair is_string is_value) Scope
H7 : is_list (is_list (is_pair is_string is_value)) EE1
H8 : is_list (is_pair is_string is_value) Scope1
H9 : is_list (is_list (is_pair is_string is_value)) EE2
H10 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Proof completed.
 < Prove looseEval:host:evalExpr_scopes_same_exists,
         looseEval:host:evalStmt_scopes_same_exists,
         looseEval:host:evalArgs_scopes_same_exists,
         looseEval: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.26:

Variables: FE EE_A EE_B Ty
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) nilVal [] @
============================
 evalExpr FE EE_B (nil Ty) nilVal []
 < search.

Subgoal 1.27:

Variables: FE EE_A O EE_B O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) (consVal V1 V2) O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V2 O3 *
EvA3 : O2 ++ O3 = O
============================
 evalExpr FE EE_B (cons E1 E2) (consVal V1 V2) O
 < case IsE.

Subgoal 1.27:

Variables: FE EE_A O EE_B O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) (consVal V1 V2) O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V2 O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 evalExpr FE EE_B (cons E1 E2) (consVal V1 V2) O
 < apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.27:

Variables: FE EE_A O EE_B O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) (consVal V1 V2) O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V2 O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : evalExpr FE EE_B E1 V1 O2
============================
 evalExpr FE EE_B (cons E1 E2) (consVal V1 V2) O
 < apply IH_E to _ _ _ _ SS EvA2.

Subgoal 1.27:

Variables: FE EE_A O EE_B O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) (consVal V1 V2) O @
EvA1 : evalExpr FE EE_A E1 V1 O2 *
EvA2 : evalExpr FE EE_A E2 V2 O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : evalExpr FE EE_B E1 V1 O2
H4 : evalExpr FE EE_B E2 V2 O3
============================
 evalExpr FE EE_B (cons E1 E2) (consVal V1 V2) O
 < search.

Subgoal 1.28:

Variables: FE EE_A V O EE_B Tl E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 (consVal V Tl) O *
============================
 evalExpr FE EE_B (head E1) V O
 < case IsE.

Subgoal 1.28:

Variables: FE EE_A V O EE_B Tl E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 (consVal V Tl) O *
H1 : is_expr E1
============================
 evalExpr FE EE_B (head E1) V O
 < apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.28:

Variables: FE EE_A V O EE_B Tl E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 (consVal V Tl) O *
H1 : is_expr E1
H2 : evalExpr FE EE_B E1 (consVal V Tl) O
============================
 evalExpr FE EE_B (head E1) V O
 < search.

Subgoal 1.29:

Variables: FE EE_A V O EE_B Hd E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 (consVal Hd V) O *
============================
 evalExpr FE EE_B (tail E1) V O
 < case IsE.

Subgoal 1.29:

Variables: FE EE_A V O EE_B Hd E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 (consVal Hd V) O *
H1 : is_expr E1
============================
 evalExpr FE EE_B (tail E1) V O
 < apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.29:

Variables: FE EE_A V O EE_B Hd E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A E1 (consVal Hd V) O *
H1 : is_expr E1
H2 : evalExpr FE EE_B E1 (consVal Hd V) O
============================
 evalExpr FE EE_B (tail E1) V O
 < search.

Subgoal 1.30:

Variables: FE EE_A O EE_B E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) trueVal O @
EvA1 : evalExpr FE EE_A E1 nilVal O *
============================
 evalExpr FE EE_B (null E1) trueVal O
 < case IsE.

Subgoal 1.30:

Variables: FE EE_A O EE_B E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) trueVal O @
EvA1 : evalExpr FE EE_A E1 nilVal O *
H1 : is_expr E1
============================
 evalExpr FE EE_B (null E1) trueVal O
 < apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.30:

Variables: FE EE_A O EE_B E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) trueVal O @
EvA1 : evalExpr FE EE_A E1 nilVal O *
H1 : is_expr E1
H2 : evalExpr FE EE_B E1 nilVal O
============================
 evalExpr FE EE_B (null E1) trueVal O
 < search.

Subgoal 1.31:

Variables: FE EE_A O EE_B Hd Tl E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) falseVal O @
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) O *
============================
 evalExpr FE EE_B (null E1) falseVal O
 < case IsE.

Subgoal 1.31:

Variables: FE EE_A O EE_B Hd Tl E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) falseVal O @
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) O *
H1 : is_expr E1
============================
 evalExpr FE EE_B (null E1) falseVal O
 < apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.31:

Variables: FE EE_A O EE_B Hd Tl E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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) falseVal O @
EvA1 : evalExpr FE EE_A E1 (consVal Hd Tl) O *
H1 : is_expr E1
H2 : evalExpr FE EE_B E1 (consVal Hd Tl) O
============================
 evalExpr FE EE_B (null E1) falseVal O
 < search.

Subgoal 1.32:

Variables: FE EE_A V O EE_B LV O2 Idx O3 I L
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A L LV O2 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
============================
 evalExpr FE EE_B (index L I) V O
 < case IsE.

Subgoal 1.32:

Variables: FE EE_A V O EE_B LV O2 Idx O3 I L
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A L LV O2 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
============================
 evalExpr FE EE_B (index L I) V O
 < apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.32:

Variables: FE EE_A V O EE_B LV O2 Idx O3 I L
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A L LV O2 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : evalExpr FE EE_B L LV O2
============================
 evalExpr FE EE_B (index L I) V O
 < apply IH_E to _ _ _ _ SS EvA2.

Subgoal 1.32:

Variables: FE EE_A V O EE_B LV O2 Idx O3 I L
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O @
EvA1 : evalExpr FE EE_A L LV O2 *
EvA2 : evalExpr FE EE_A I (intVal Idx) O3 *
EvA3 : listIndex LV Idx V
EvA4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : evalExpr FE EE_B L LV O2
H4 : evalExpr FE EE_B I (intVal Idx) O3
============================
 evalExpr FE EE_B (index L I) V O
 < search.

Subgoal 1.33:

Variables: FE EE_A O EE_B V1 I E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (looseEval: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 (looseEval:list:length E1) (intVal I) O @
EvA1 : evalExpr FE EE_A E1 V1 O *
EvA2 : listLength V1 I
============================
 evalExpr FE EE_B (looseEval:list:length E1) (intVal I) O
 < case IsE.

Subgoal 1.33:

Variables: FE EE_A O EE_B V1 I E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (looseEval:list:length E1) (intVal I) O @
EvA1 : evalExpr FE EE_A E1 V1 O *
EvA2 : listLength V1 I
H1 : is_expr E1
============================
 evalExpr FE EE_B (looseEval:list:length E1) (intVal I) O
 < apply IH_E to _ _ _ _ SS EvA1.

Subgoal 1.33:

Variables: FE EE_A O EE_B V1 I E1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (looseEval:list:length E1) (intVal I) O @
EvA1 : evalExpr FE EE_A E1 V1 O *
EvA2 : listLength V1 I
H1 : is_expr E1
H2 : evalExpr FE EE_B E1 V1 O
============================
 evalExpr FE EE_B (looseEval:list:length E1) (intVal I) O
 < search.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B LV N O2 V O3 LV2 E I L
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O2 *
EvA3 : evalExpr FE EE_A E V O3 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A 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 LV N O2 V O3 LV2 E I L
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O2 *
EvA3 : evalExpr FE EE_A E V O3 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A 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
 < apply IH_E to _ _ _ _ SS EvA2.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B LV N O2 V O3 LV2 E I L
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O2 *
EvA3 : evalExpr FE EE_A E V O3 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : evalExpr FE EE_B I (intVal N) O2
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < apply IH_E to _ _ _ _ SS EvA3.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B LV N O2 V O3 LV2 E I L
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O2 *
EvA3 : evalExpr FE EE_A E V O3 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : evalExpr FE EE_B I (intVal N) O2
H5 : evalExpr FE EE_B E V O3
============================
 exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
 < LB: apply scopes_same_lookupScopes_exists to _ _ SS EvA1.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B LV N O2 V O3 LV2 E I L
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O2 *
EvA3 : evalExpr FE EE_A E V O3 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : evalExpr FE EE_B I (intVal N) O2
H5 : evalExpr FE EE_B E V O3
LB : lookupScopes L EE_B 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 LV N O2 V O3 LV2 E I L B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 : lookupScopes L EE_A LV
EvA2 : evalExpr FE EE_A I (intVal N) O2 *
EvA3 : evalExpr FE EE_A E V O3 *
EvA4 : updateListIndex LV N V LV2
EvA5 : replaceScopes L LV2 EE_A EE_A'
EvA6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : evalExpr FE EE_B I (intVal N) O2
H5 : evalExpr FE EE_B E V O3
LB : lookupScopes L EE_B LV
H6 : replaceScopes L LV2 EE_B 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 O2 O3 Body L X
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O2 *
EvA2 : iterateList FE EE_A 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 O2 O3 Body L X
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O2 *
EvA2 : iterateList FE EE_A 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
 < apply IH_E to _ _ _ _ SS EvA1.

Subgoal 2.16:

Variables: FE EE_A EE_A' O EE_B LV O2 O3 Body L X
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O2 *
EvA2 : iterateList FE EE_A LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : evalExpr FE EE_B L LV O2
============================
 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 O2 O3 Body L X
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O2 *
EvA2 : iterateList FE EE_A LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : evalExpr FE EE_B L LV O2
H5 : 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 O2 O3 Body L X EE_B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 O2 *
EvA2 : iterateList FE EE_A LV X Body EE_A' O3 *
EvA3 : O2 ++ O3 = O
H1 : is_string X
H2 : is_expr L
H3 : is_stmt Body
H4 : evalExpr FE EE_B L LV O2
H5 : is_value LV
H6 : iterateList FE EE_B LV X Body EE_B' 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
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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' nilVal X Body EE_A' [] @
============================
 exists EE_B', iterateList FE EE_B nilVal X Body EE_B' []
 < search.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Scope EE1 O2 O3 Tl Hd
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_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 (consVal Hd Tl) X Body EE_A' O @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA3 : O2 ++ O3 = O
============================
 exists EE_B', iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O
 < case IsV.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Scope EE1 O2 O3 Tl Hd
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (consVal Hd Tl) X Body EE_A' O @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
============================
 exists EE_B', iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O
 < SS1: 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 Scope EE1 O2 O3 Tl Hd
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (consVal Hd Tl) X Body EE_A' O @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
SS1 : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
============================
 exists EE_B', iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O
 < EvB: apply IH_S to _ _ _ _ SS1 ILA1.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Scope EE1 O2 O3 Tl Hd EE_B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (consVal Hd Tl) X Body EE_A' O @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
SS1 : 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 (consVal Hd Tl) X Body EE_B' O
 < SS2: apply evalStmt_scopes_same_ctx to _ _ _ _ SS1 ILA1 EvB.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Scope EE1 O2 O3 Tl Hd EE_B'
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (consVal Hd Tl) X Body EE_A' O @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
SS1 : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body EE_B' O2
SS2 : scopes_same (Scope::EE1) EE_B'
============================
 exists EE_B', iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O
 < SS': case SS2.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Scope EE1 O2 O3 Tl Hd BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (consVal Hd Tl) X Body EE_A' O @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
SS1 : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2
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 (consVal Hd Tl) X Body EE_B' O
 < IsEE1+: apply evalStmt_isCtx to _ _ _ ILA1.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Scope EE1 O2 O3 Tl Hd BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (consVal Hd Tl) X Body EE_A' O @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
SS1 : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2
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
IsEE1+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE1)
============================
 exists EE_B', iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O
 < case IsEE1+.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Scope EE1 O2 O3 Tl Hd BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (consVal Hd Tl) X Body EE_A' O @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
SS1 : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2
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
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
============================
 exists EE_B', iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O
 < IsBR+: apply evalStmt_isCtx to _ _ _ EvB.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Scope EE1 O2 O3 Tl Hd BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (consVal Hd Tl) X Body EE_A' O @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
SS1 : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2
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
H3 : is_list (is_pair is_string is_value) Scope
H4 : is_list (is_list (is_pair is_string is_value)) EE1
IsBR+ : is_list (is_list (is_pair is_string is_value)) (B::BRest)
============================
 exists EE_B', iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O
 < case IsBR+.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Scope EE1 O2 O3 Tl Hd BRest B
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (consVal Hd Tl) X Body EE_A' O @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
SS1 : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2
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
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) B
H6 : is_list (is_list (is_pair is_string is_value)) BRest
============================
 exists EE_B', iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O
 < apply IH_IL to _ _ _ _ _ _ SS'2 ILA2.

Subgoal 5.2:

Variables: X Body FE EE_A EE_A' O EE_B Scope EE1 O2 O3 Tl Hd BRest B EE_B'1
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (consVal Hd Tl) X Body EE_A' O @
ILA1 : evalStmt FE ([(X, Hd)]::EE_A) Body (Scope::EE1) O2 *
ILA2 : iterateList FE EE1 Tl X Body EE_A' O3 *
ILA3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
SS1 : scopes_same ([(X, Hd)]::EE_A) ([(X, Hd)]::EE_B)
EvB : evalStmt FE ([(X, Hd)]::EE_B) Body (B::BRest) O2
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
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) B
H6 : is_list (is_list (is_pair is_string is_value)) BRest
H7 : iterateList FE BRest Tl X Body EE_B'1 O3
============================
 exists EE_B', iterateList FE EE_B (consVal Hd Tl) X Body EE_B' O
 < search.

Proof completed.
 < Theorem append_nil_output :
     forall O, is_list is_value O -> O ++ [] = O.

============================
 forall O, is_list is_value O -> O ++ [] = O
 < induction on 1.

IH : forall O, is_list is_value O * -> O ++ [] = O
============================
 forall O, is_list is_value O @ -> O ++ [] = O
 < intros Is.

Variables: O
IH : forall O, is_list is_value O * -> O ++ [] = O
Is : is_list is_value O @
============================
 O ++ [] = O
 < Is: case Is.

Subgoal 1:

IH : forall O, is_list is_value O * -> O ++ [] = O
============================
 [] ++ [] = []
 < search.

Subgoal 2:

Variables: T H
IH : forall O, is_list is_value O * -> O ++ [] = O
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 O, is_list is_value O * -> O ++ [] = O
Is : is_value H
Is1 : is_list is_value T *
H1 : T ++ [] = T
============================
 H::T ++ [] = H::T
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_evalExpr_exists.

Subgoal 1:

Variables: FE EE V O Ty
Pr : |{expr}- nil Ty ~~> num 0
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 O
============================
 exists V', evalExpr FE EE (num 0) V' O
 < case Ev.

Subgoal 1:

Variables: FE EE Ty
Pr : |{expr}- nil Ty ~~> num 0
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 V', evalExpr FE EE (num 0) V' []
 < search.

Subgoal 2:

Variables: FE EE V O E2 E1
Pr : |{expr}- cons E1 E2 ~~> eq E1 E2
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 O
============================
 exists V', evalExpr FE EE (eq E1 E2) V' O
 < case IsE.

Subgoal 2:

Variables: FE EE V O E2 E1
Pr : |{expr}- cons E1 E2 ~~> eq 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 O
H1 : is_expr E1
H2 : is_expr E2
============================
 exists V', evalExpr FE EE (eq E1 E2) V' O
 < Ev: case Ev.

Subgoal 2:

Variables: FE EE O E2 E1 O2 O3 V2 V1
Pr : |{expr}- cons E1 E2 ~~> eq 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
H1 : is_expr E1
H2 : is_expr E2
Ev : evalExpr FE EE E1 V1 O2
Ev1 : evalExpr FE EE E2 V2 O3
Ev2 : O2 ++ O3 = O
============================
 exists V', evalExpr FE EE (eq E1 E2) V' O
 < IsV1: apply evalExpr_isValue to _ _ _ Ev.

Subgoal 2:

Variables: FE EE O E2 E1 O2 O3 V2 V1
Pr : |{expr}- cons E1 E2 ~~> eq 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
H1 : is_expr E1
H2 : is_expr E2
Ev : evalExpr FE EE E1 V1 O2
Ev1 : evalExpr FE EE E2 V2 O3
Ev2 : O2 ++ O3 = O
IsV1 : is_value V1
============================
 exists V', evalExpr FE EE (eq E1 E2) V' O
 < IsV2: apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 2:

Variables: FE EE O E2 E1 O2 O3 V2 V1
Pr : |{expr}- cons E1 E2 ~~> eq 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
H1 : is_expr E1
H2 : is_expr E2
Ev : evalExpr FE EE E1 V1 O2
Ev1 : evalExpr FE EE E2 V2 O3
Ev2 : O2 ++ O3 = O
IsV1 : is_value V1
IsV2 : is_value V2
============================
 exists V', evalExpr FE EE (eq E1 E2) V' O
 < Or: apply is_value_eq_or_not to IsV1 IsV2.

Subgoal 2:

Variables: FE EE O E2 E1 O2 O3 V2 V1
Pr : |{expr}- cons E1 E2 ~~> eq 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
H1 : is_expr E1
H2 : is_expr E2
Ev : evalExpr FE EE E1 V1 O2
Ev1 : evalExpr FE EE E2 V2 O3
Ev2 : O2 ++ O3 = O
IsV1 : is_value V1
IsV2 : is_value V2
Or : V1 = V2 \/ (V1 = V2 -> false)
============================
 exists V', evalExpr FE EE (eq E1 E2) V' O
 < case Or.

Subgoal 2.1:

Variables: FE EE O E2 E1 O2 O3 V2
Pr : |{expr}- cons E1 E2 ~~> eq 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
H1 : is_expr E1
H2 : is_expr E2
Ev : evalExpr FE EE E1 V2 O2
Ev1 : evalExpr FE EE E2 V2 O3
Ev2 : O2 ++ O3 = O
IsV1 : is_value V2
IsV2 : is_value V2
============================
 exists V', evalExpr FE EE (eq E1 E2) V' O
 < search.

Subgoal 2.2:

Variables: FE EE O E2 E1 O2 O3 V2 V1
Pr : |{expr}- cons E1 E2 ~~> eq 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
H1 : is_expr E1
H2 : is_expr E2
Ev : evalExpr FE EE E1 V1 O2
Ev1 : evalExpr FE EE E2 V2 O3
Ev2 : O2 ++ O3 = O
IsV1 : is_value V1
IsV2 : is_value V2
H3 : V1 = V2 -> false
============================
 exists V', evalExpr FE EE (eq E1 E2) V' O
 < search.

Subgoal 3:

Variables: E' FE EE V O
Pr : |{expr}- null E' ~~> E'
IsE : is_expr (null 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 : evalExpr FE EE (null E') V O
============================
 exists V', evalExpr FE EE E' V' O
 < case Ev.

Subgoal 3.1:

Variables: E' FE EE O
Pr : |{expr}- null E' ~~> E'
IsE : is_expr (null 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
H1 : evalExpr FE EE E' nilVal O
============================
 exists V', evalExpr FE EE E' V' O
 < search.

Subgoal 3.2:

Variables: E' FE EE O Hd Tl
Pr : |{expr}- null E' ~~> E'
IsE : is_expr (null 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
H1 : evalExpr FE EE E' (consVal Hd Tl) O
============================
 exists V', evalExpr FE EE E' V' O
 < search.

Subgoal 4:

Variables: E' FE EE V O
Pr : |{expr}- head E' ~~> E'
IsE : is_expr (head 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 : evalExpr FE EE (head E') V O
============================
 exists V', evalExpr FE EE E' V' O
 < case Ev.

Subgoal 4:

Variables: E' FE EE V O Tl
Pr : |{expr}- head E' ~~> E'
IsE : is_expr (head 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
H1 : evalExpr FE EE E' (consVal V Tl) O
============================
 exists V', evalExpr FE EE E' V' O
 < search.

Subgoal 5:

Variables: E' FE EE V O
Pr : |{expr}- tail E' ~~> E'
IsE : is_expr (tail 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 : evalExpr FE EE (tail E') V O
============================
 exists V', evalExpr FE EE E' V' O
 < case Ev.

Subgoal 5:

Variables: E' FE EE V O Hd
Pr : |{expr}- tail E' ~~> E'
IsE : is_expr (tail 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
H1 : evalExpr FE EE E' (consVal Hd V) O
============================
 exists V', evalExpr FE EE E' V' O
 < search.

Subgoal 6:

Variables: FE EE V O Index Lst
Pr : |{expr}- index Lst Index ~~> eq Lst Index
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 O
============================
 exists V', evalExpr FE EE (eq Lst Index) V' O
 < case IsE.

Subgoal 6:

Variables: FE EE V O Index Lst
Pr : |{expr}- index Lst Index ~~> eq 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 O
H1 : is_expr Lst
H2 : is_expr Index
============================
 exists V', evalExpr FE EE (eq Lst Index) V' O
 < Ev: case Ev.

Subgoal 6:

Variables: FE EE V O Index Lst LV O2 Idx O3
Pr : |{expr}- index Lst Index ~~> eq 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
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV O2
Ev1 : evalExpr FE EE Index (intVal Idx) O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
============================
 exists V', evalExpr FE EE (eq Lst Index) V' O
 < IsV1: apply evalExpr_isValue to _ _ _ Ev.

Subgoal 6:

Variables: FE EE V O Index Lst LV O2 Idx O3
Pr : |{expr}- index Lst Index ~~> eq 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
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV O2
Ev1 : evalExpr FE EE Index (intVal Idx) O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
IsV1 : is_value LV
============================
 exists V', evalExpr FE EE (eq Lst Index) V' O
 < IsV2: apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 6:

Variables: FE EE V O Index Lst LV O2 Idx O3
Pr : |{expr}- index Lst Index ~~> eq 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
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV O2
Ev1 : evalExpr FE EE Index (intVal Idx) O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
IsV1 : is_value LV
IsV2 : is_value (intVal Idx)
============================
 exists V', evalExpr FE EE (eq Lst Index) V' O
 < Or: apply is_value_eq_or_not to IsV1 IsV2.

Subgoal 6:

Variables: FE EE V O Index Lst LV O2 Idx O3
Pr : |{expr}- index Lst Index ~~> eq 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
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV O2
Ev1 : evalExpr FE EE Index (intVal Idx) O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
IsV1 : is_value LV
IsV2 : is_value (intVal Idx)
Or : LV = intVal Idx \/ (LV = intVal Idx -> false)
============================
 exists V', evalExpr FE EE (eq Lst Index) V' O
 < case Or.

Subgoal 6.1:

Variables: FE EE V O Index Lst O2 Idx O3
Pr : |{expr}- index Lst Index ~~> eq 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
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst (intVal Idx) O2
Ev1 : evalExpr FE EE Index (intVal Idx) O3
Ev2 : listIndex (intVal Idx) Idx V
Ev3 : O2 ++ O3 = O
IsV1 : is_value (intVal Idx)
IsV2 : is_value (intVal Idx)
============================
 exists V', evalExpr FE EE (eq Lst Index) V' O
 < search.

Subgoal 6.2:

Variables: FE EE V O Index Lst LV O2 Idx O3
Pr : |{expr}- index Lst Index ~~> eq 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
H1 : is_expr Lst
H2 : is_expr Index
Ev : evalExpr FE EE Lst LV O2
Ev1 : evalExpr FE EE Index (intVal Idx) O3
Ev2 : listIndex LV Idx V
Ev3 : O2 ++ O3 = O
IsV1 : is_value LV
IsV2 : is_value (intVal Idx)
H3 : LV = intVal Idx -> false
============================
 exists V', evalExpr FE EE (eq Lst Index) V' O
 < search.

Subgoal 7:

Variables: E' FE EE V O
Pr : |{expr}- looseEval:list:length E' ~~> E'
IsE : is_expr (looseEval:list:length 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 : evalExpr FE EE (looseEval:list:length E') V O
============================
 exists V', evalExpr FE EE E' V' O
 < case Ev.

Subgoal 7:

Variables: E' FE EE O V1 I
Pr : |{expr}- looseEval:list:length E' ~~> E'
IsE : is_expr (looseEval:list:length 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
H1 : evalExpr FE EE E' V1 O
H2 : listLength V1 I
============================
 exists V', evalExpr FE EE E' V' O
 < search.

Proof completed.
 < Extensible_Theorem
      iterateList_to_while : forall FE EE V X Body EE' O Names L,
         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
      on IL.

Subgoal 1:

Variables: FE X Body EE' 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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_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' nilVal X Body EE' [] @
Names : names EE' Names
Fr : fresh_name "L" (X::Names) L
============================
 exists V',
   evalStmt FE ([(L, nilVal)]::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 Scope EE3 O2 O3 Tl Hd
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 (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
============================
 exists V',
   evalStmt FE ([(L, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd
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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
============================
 exists V',
   evalStmt FE ([(L, consVal Hd Tl)]::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 _ _ _ IL1.

Subgoal 2:

Variables: FE EE X Body EE' O Names L Scope EE3 O2 O3 Tl Hd
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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
IsEE''+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
 exists V',
   evalStmt FE ([(L, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd
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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 _ _ _ IL1.

Subgoal 2:

Variables: FE EE X Body EE' O Names L O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : mem X1 Names
============================
 mem X1 (X::Names)
 < search.

Subgoal 2.2:

Variables: FE EE X Body EE' O Names L O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) L
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : mem X1 N
============================
 mem X1 (X::N)
 < search.

Subgoal 2:

Variables: FE EE X Body EE' O Names O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 _ _ _ _ _ IL2 Names'' Fr'.

Subgoal 2:

Variables: FE EE X Body EE' O Names O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O1 Scope EE1 O2 O3 O12,
   evalExpr FE ([(F, consVal Hd Tl)]::EE) (not (null (name F))) trueVal O1 /\
   (evalStmt FE ([]::([(F, consVal Hd Tl)]::EE)) (seq (declare intTy X (head (name F))) (seq (assign F (tail (name F))) Body)) (Scope::EE1) O2 /\
   (evalStmt FE EE1 (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 [],
   Scope',
   [(F, Tl)]::EE'',
   O2,
   O3,
   O2.

Subgoal 2:

Variables: FE EE X Body EE' O Names O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::EE) (not (null (name F))) trueVal [] /\
 (evalStmt FE ([]::([(F, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::EE) (not (null (name F))) trueVal []
 < search.

Subgoal 2.4:

Variables: FE EE X Body EE' O Names O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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, consVal Hd Tl)]::EE),
   [],
   O2.

Subgoal 2.4:

Variables: FE EE X Body EE' O Names O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::EE)) (declare intTy X (head (name F))) ([(X, Hd)]::([(F, consVal Hd Tl)]::EE)) [] /\
 (evalStmt FE ([(X, Hd)]::([(F, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::EE)) (declare intTy X (head (name F))) ([(X, Hd)]::([(F, consVal Hd Tl)]::EE)) []
 < search 20.

Subgoal 2.4.2:

Variables: FE EE X Body EE' O Names O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) F Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (F::Names) F
IL1 : evalStmt FE ([(F, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl F Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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, consVal Hd Tl)]::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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : is_string F
============================
 evalStmt FE ([(X, Hd)]::([(F, Tl)]::EE)) Body (Scope'::([(F, Tl)]::EE'')) O2
 < Ev: apply evalStmt_newNameScopes_exists to _ _ _ _ IL1 NNS.

Subgoal 2.4.2.3:

Variables: FE EE X Body EE' O Names O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 IL1 _.

Subgoal 2.4.2.3:

Variables: FE EE X Body EE' O Names O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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'')
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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'')
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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'')
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
============================
 Scope'::EE'' = Scope'::EE''
 < search.

Subgoal 2.4.2.3.2.1.2:

Variables: FE EE X Body EE' O Names O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 (Scope'::EE'')
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 (Scope'::EE'')
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 (Scope'::EE'')
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 (Scope'::EE'')
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 (Scope'::EE'')
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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'')
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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'')
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
Len : length EE'' N'
Len1 : 1 + N' = Len
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
Len : length EE'' N'
Len1 : 1 + N' = Len
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
Len : length EE'' N'
Len1 : 1 + N' = Len
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
Len : length EE'' N'
Len1 : 1 + N' = N'
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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''
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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''
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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''
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
============================
 EE'' = EE''
 < search.

Subgoal 2.4.2.3.3.1.1.2:

Variables: FE EE X Body EE' O Names O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
D : 1 + N4 = 0
D1 : drop N4 L2 EE''
P : 1 + -1 = 0
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 EE''
P : 1 + -1 = 0
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 EE''
P : 1 + -1 = 0
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : is_integer 0
D : 1 + -1 = 0
D1 : drop -1 L2 EE''
P : 1 + -1 = 0
H5 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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''
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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''
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL2 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL2 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL2 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL2 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL2 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::(S::BR)) O2 *
IL2 : iterateList FE (S::BR) Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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
H3 : 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
H4 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 O2 O3 Tl Hd 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
IL : iterateList FE EE (consVal Hd Tl) X Body EE' O @
Names : names EE Names
Fr : fresh_name "L" (X::Names) F
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 *
IL2 : iterateList FE EE'' Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 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 Tl VOld
IH : forall L I V L', updateListIndex L I V L' * -> is_integer I
============================
 is_integer 0
 < search.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
============================
 is_integer I
 < IsI1: apply IH to ULI1.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
IsI1 : is_integer I1
============================
 is_integer I
 < apply minus_integer_is_integer_result to _ ULI.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
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 Tl VOld
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer 0
============================
 0 >= 0
 < search.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
============================
 I >= 0
 < GEq: apply IH to ULI1.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEq : I1 >= 0
============================
 I >= 0
 < P: apply minus_plus_same_integer to _ _ ULI.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEq : I1 >= 0
P : I1 + 1 = I
============================
 I >= 0
 < IsI1: apply updateListIndex_is_integer to ULI1.

Subgoal 2:

Variables: I V I1 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
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 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
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 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
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 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
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 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
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 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
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 TlNew X Tl
IH : forall L I V L', updateListIndex L I V L' * -> I >= 0
IsI : is_integer I
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
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 nilVal;
   listy (consVal Hd Tl) :=
     listy Tl.


 < Define flipOnto : value -> value -> value -> prop by
   flipOnto nilVal L L;
   flipOnto (consVal H T) L L' :=
     flipOnto T (consVal H L) L'.


 < Theorem eval_update_loop2 :
     forall (Hold : string) (SaveI : string) (SaveE : string) (L : string) V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) LVal LV.

============================
 forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
   (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
   (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
   exists G' LV,
     (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
     replaceScopes L LV G G') /\
     flipOnto (consVal H HoldL) LVal LV
 < induction on 1.

IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) LVal LV
============================
 forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
   (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
   (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) -> lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
   exists G' LV,
     (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
     replaceScopes L LV G G') /\
     flipOnto (consVal H HoldL) LVal LV
 < intros ListyH IsFE IsCtx NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL LS.

Variables: Hold SaveI SaveE L V H HoldL LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H HoldL) LVal LV
 < ListyH: case ListyH.

Subgoal 1:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H nilVal) LVal LV
 < EvCondA: assert <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [].

Subgoal 1.1:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
 < search 6.

Subgoal 1:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H nilVal) LVal LV
 < EvBody1A: assert exists G',
     <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
     replaceScopes L (consVal H LVal) G G'.

Subgoal 1.2:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < Is+: assert is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)).

Subgoal 1.2:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < IsL: apply lookupScopes_is to _ LS.

Subgoal 1.2:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < LS: assert lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal.

Subgoal 1.2:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < EvCP: assert exists VE,
     <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE [].

Subgoal 1.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < IsC: case IsCtx (keep).

Subgoal 1.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
IsC : is_list (is_pair is_string is_value) [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]
IsC1 : is_list (is_list (is_pair is_string is_value)) G
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < IsC: case IsC.

Subgoal 1.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC : is_pair is_string is_value (Hold, consVal H nilVal)
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < IsP: case IsC.

Subgoal 1.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
IsP : is_string Hold
IsP1 : is_value (consVal H nilVal)
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < IsH: case IsP1.

Subgoal 1.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
IsP : is_string Hold
IsH : is_value H
IsH1 : is_value nilVal
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < Or: apply is_value_eq_or_not to IsH IsL.

Subgoal 1.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
IsP : is_string Hold
IsH : is_value H
IsH1 : is_value nilVal
Or : H = LVal \/ (H = LVal -> false)
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < N: case Or.

Subgoal 1.2.1.1:

Variables: Hold SaveI SaveE L V LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal LVal nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal LVal nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal LVal nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal LVal nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal LVal nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
IsP : is_string Hold
IsH : is_value LVal
IsH1 : is_value nilVal
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal LVal nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < search 20.

Subgoal 1.2.1.2:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
IsP : is_string Hold
IsH : is_value H
IsH1 : is_value nilVal
N : H = LVal -> false
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < search 20.

Subgoal 1.2:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
EvCP : exists VE,
         <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < case EvCP.

Subgoal 1.2:

Variables: Hold SaveI SaveE L V H LVal G FE VE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < RS: apply lookupScopes_replaceScopes_exists to _ _ LS with
         V' = consVal H LVal.

Subgoal 1.2:

Variables: Hold SaveI SaveE L V H LVal G FE VE R
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) R
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < RS: case RS (keep).

Subgoal 1.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE VE I LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G)
RS1 : mem (L, I) [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]
RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] L LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < M: case RS1.

Subgoal 1.2.2.1:

Variables: Hold SaveI SaveE V H LVal G FE VE LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = Hold -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = Hold -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = Hold -> false
LS : lookupScopes Hold ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string Hold
LS1 : lookupScopes Hold ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name Hold)) VE []
RS : replaceScopes Hold (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (((Hold, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] Hold LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign Hold (cons (head (name Hold)) (name Hold))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes Hold (consVal H LVal) G G'
 < apply NEqHL to _.

Subgoal 1.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE VE I LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < M: case M.

Subgoal 1.2.2.2.1:

Variables: Hold SaveI SaveE V H LVal G FE VE LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveI -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveI -> false
LS : lookupScopes SaveI ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string SaveI
LS1 : lookupScopes SaveI ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name SaveI)) VE []
RS : replaceScopes SaveI (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (((SaveI, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] SaveI LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveI (cons (head (name Hold)) (name SaveI))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes SaveI (consVal H LVal) G G'
 < apply NEqIL to _.

Subgoal 1.2.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE VE I LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) [(SaveE, V)]
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < M: case M.

Subgoal 1.2.2.2.2.1:

Variables: Hold SaveI SaveE V H LVal G FE VE LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveE -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveE -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveE -> false
LS : lookupScopes SaveE ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string SaveE
LS1 : lookupScopes SaveE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name SaveE)) VE []
RS : replaceScopes SaveE (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (((SaveE, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] SaveE LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveE (cons (head (name Hold)) (name SaveE))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes SaveE (consVal H LVal) G G'
 < apply NEqEL to _.

Subgoal 1.2.2.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE VE I LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) []
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < case M.

Subgoal 1.2.3:

Variables: Hold SaveI SaveE L V H LVal G FE VE New
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G))
IsL : is_value LVal
IsL1 : is_string L
LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) LVal
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] L
RS2 : replaceScopes L (consVal H LVal) G New
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < search 20.

Subgoal 1:

Variables: Hold SaveI SaveE L V H LVal G FE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : exists G',
             <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
             replaceScopes L (consVal H LVal) G G'
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H nilVal) LVal LV
 < EvBody1A: case EvBody1A.

Subgoal 1:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H nilVal) LVal LV
 < EvBody1B: assert <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) [].

Subgoal 1.3:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
 < unfold .

Subgoal 1.3:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 exists V1,
   <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (tail (name Hold)) V1 [] /\
   replaceScopes Hold V1 ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'))
 < exists nilVal.

Subgoal 1.3:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (tail (name Hold)) nilVal [] /\
 replaceScopes Hold nilVal ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'))
 < split.

Subgoal 1.3.1:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (tail (name Hold)) nilVal []
 < search.

Subgoal 1.3.2:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 replaceScopes Hold nilVal ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'))
 < unfold .

Subgoal 1.3.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 no_lookup [] Hold
 < search.

Subgoal 1.3.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 replaceScopes Hold nilVal ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G') ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G')
 < unfold .

Subgoal 1.3.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 exists I,
   mem (Hold, I) [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] /\
   remove_all [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < exists consVal H nilVal.

Subgoal 1.3.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 mem (Hold, consVal H nilVal) [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] /\
 remove_all [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < split.

Subgoal 1.3.2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 mem (Hold, consVal H nilVal) [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]
 < search.

Subgoal 1.3.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 remove_all [(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < unfold .

Subgoal 1.3.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 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 L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 SaveI = Hold -> false
 < intros E.

Subgoal 1.3.2.2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
E : SaveI = Hold
============================
 false
 < case E.

Subgoal 1.3.2.2.2.1:

Variables: Hold SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (Hold, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = Hold -> false
NEqHL : Hold = L -> false
NEqIE : Hold = SaveE -> false
NEqIL : Hold = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (Hold, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (Hold, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (Hold, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (Hold, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 false
 < backchain NEqHI.

Subgoal 1.3.2.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 remove_all [(SaveE, V)] Hold [(SaveE, V)]
 < unfold .

Subgoal 1.3.2.2.2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 SaveE = Hold -> false
 < intros E.

Subgoal 1.3.2.2.2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
E : SaveE = Hold
============================
 false
 < case E.

Subgoal 1.3.2.2.2.2.1:

Variables: Hold SaveI L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (Hold, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = Hold -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = Hold -> false
NEqEL : Hold = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (Hold, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (Hold, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (Hold, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (Hold, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 false
 < backchain NEqHE.

Subgoal 1.3.2.2.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 remove_all [] Hold []
 < search.

Subgoal 1:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H nilVal) LVal LV
 < EvCondB: assert <evalExpr {P}> FE ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (not (null (name Hold))) falseVal [].

Subgoal 1.4:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
============================
 <evalExpr {P}> FE ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (not (null (name Hold))) falseVal []
 < search 6.

Subgoal 1:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvCondB : <evalExpr {P}> FE ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (not (null (name Hold))) falseVal []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H nilVal) LVal LV
 < exists G',
   consVal H LVal.

Subgoal 1:

Variables: Hold SaveI SaveE L V H LVal G FE G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) LVal
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvCondB : <evalExpr {P}> FE ([]::([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G')) (not (null (name Hold))) falseVal []
============================
 (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 replaceScopes L (consVal H LVal) G G') /\
 flipOnto (consVal H nilVal) LVal (consVal H LVal)
 < search 20.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < EvCondA: assert <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [].

Subgoal 2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
 < search 6.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < EvBody1A: assert exists G',
     <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
     replaceScopes L (consVal H LVal) G G'.

Subgoal 2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < IsL: apply lookupScopes_is to _ LS.

Subgoal 2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < EvCP: assert exists VE,
     <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE [].

Subgoal 2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < IsC: case IsCtx (keep).

Subgoal 2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
IsC : is_list (is_pair is_string is_value) [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]
IsC1 : is_list (is_list (is_pair is_string is_value)) G
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < IsC: case IsC.

Subgoal 2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC : is_pair is_string is_value (Hold, consVal H (consVal Hd Tl))
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < IsP: case IsC.

Subgoal 2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
IsP : is_string Hold
IsP1 : is_value (consVal H (consVal Hd Tl))
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < IsH: case IsP1.

Subgoal 2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
IsP : is_string Hold
IsH : is_value H
IsH1 : is_value (consVal Hd Tl)
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < Or: apply is_value_eq_or_not to IsH IsL.

Subgoal 2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
IsP : is_string Hold
IsH : is_value H
IsH1 : is_value (consVal Hd Tl)
Or : H = LVal \/ (H = LVal -> false)
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < N: case Or.

Subgoal 2.2.1.1:

Variables: Hold SaveI SaveE L V LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal LVal (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal LVal (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal LVal (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
IsP : is_string Hold
IsH : is_value LVal
IsH1 : is_value (consVal Hd Tl)
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal LVal (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < search 20.

Subgoal 2.2.1.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
IsP : is_string Hold
IsH : is_value H
IsH1 : is_value (consVal Hd Tl)
N : H = LVal -> false
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
 < search 20.

Subgoal 2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
EvCP : exists VE,
         <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < case EvCP.

Subgoal 2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd VE
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < RS: apply lookupScopes_replaceScopes_exists to _ _ LS with
         V' = consVal H LVal.

Subgoal 2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd VE R
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) R
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < RS: case RS (keep).

Subgoal 2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd VE I LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G)
RS1 : mem (L, I) [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]
RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] L LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < M: case RS1.

Subgoal 2.2.2.1:

Variables: Hold SaveI SaveE V H LVal G FE Tl Hd VE LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = Hold -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = Hold -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = Hold -> false
LS : lookupScopes Hold ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string Hold
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name Hold)) VE []
RS : replaceScopes Hold (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (((Hold, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] Hold LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign Hold (cons (head (name Hold)) (name Hold))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes Hold (consVal H LVal) G G'
 < apply NEqHL to _.

Subgoal 2.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd VE I LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < M: case M.

Subgoal 2.2.2.2.1:

Variables: Hold SaveI SaveE V H LVal G FE Tl Hd VE LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveI -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveI -> false
LS : lookupScopes SaveI ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string SaveI
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name SaveI)) VE []
RS : replaceScopes SaveI (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (((SaveI, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] SaveI LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveI (cons (head (name Hold)) (name SaveI))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes SaveI (consVal H LVal) G G'
 < apply NEqIL to _.

Subgoal 2.2.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd VE I LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) [(SaveE, V)]
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < M: case M.

Subgoal 2.2.2.2.2.1:

Variables: Hold SaveI SaveE V H LVal G FE Tl Hd VE LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = SaveE -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = SaveE -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = SaveE -> false
LS : lookupScopes SaveE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string SaveE
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name SaveE)) VE []
RS : replaceScopes SaveE (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (((SaveE, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] SaveE LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign SaveE (cons (head (name Hold)) (name SaveE))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes SaveE (consVal H LVal) G G'
 < apply NEqEL to _.

Subgoal 2.2.2.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd VE I LRemain
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G)
RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] L LRemain
M : mem (L, I) []
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < case M.

Subgoal 2.2.3:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd VE New
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
IsL : is_value LVal
IsL1 : is_string L
H1 : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (eq (head (name Hold)) (name L)) VE []
RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] L
RS2 : replaceScopes L (consVal H LVal) G New
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
   replaceScopes L (consVal H LVal) G G'
 < search 7.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : exists G',
             <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) [] /\
             replaceScopes L (consVal H LVal) G G'
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < EvBody1A: case EvBody1A.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < EvBody1B: assert <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) [].

Subgoal 2.3:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
 < unfold .

Subgoal 2.3:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 exists V1,
   <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (tail (name Hold)) V1 [] /\
   replaceScopes Hold V1 ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G'))
 < exists consVal Hd Tl.

Subgoal 2.3:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (tail (name Hold)) (consVal Hd Tl) [] /\
 replaceScopes Hold (consVal Hd Tl) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G'))
 < split.

Subgoal 2.3.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (tail (name Hold)) (consVal Hd Tl) []
 < search.

Subgoal 2.3.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 replaceScopes Hold (consVal Hd Tl) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G'))
 < unfold .

Subgoal 2.3.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 no_lookup [] Hold
 < search.

Subgoal 2.3.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 replaceScopes Hold (consVal Hd Tl) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G') ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')
 < unfold .

Subgoal 2.3.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 exists I,
   mem (Hold, I) [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] /\
   remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < exists consVal H (consVal Hd Tl).

Subgoal 2.3.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 mem (Hold, consVal H (consVal Hd Tl)) [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] /\
 remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < split.

Subgoal 2.3.2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 mem (Hold, consVal H (consVal Hd Tl)) [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]
 < search.

Subgoal 2.3.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)] Hold [(SaveI, intVal 0), (SaveE, V)]
 < unfold .

Subgoal 2.3.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 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 L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 SaveI = Hold -> false
 < intros E.

Subgoal 2.3.2.2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
E : SaveI = Hold
============================
 false
 < case E.

Subgoal 2.3.2.2.2.1:

Variables: Hold SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (Hold, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = Hold -> false
NEqHL : Hold = L -> false
NEqIE : Hold = SaveE -> false
NEqIL : Hold = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (Hold, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (Hold, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (Hold, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (Hold, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 false
 < backchain NEqHI.

Subgoal 2.3.2.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 remove_all [(SaveE, V)] Hold [(SaveE, V)]
 < unfold .

Subgoal 2.3.2.2.2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 SaveE = Hold -> false
 < intros E.

Subgoal 2.3.2.2.2.2.1:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
E : SaveE = Hold
============================
 false
 < case E.

Subgoal 2.3.2.2.2.2.1:

Variables: Hold SaveI L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (Hold, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = Hold -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = Hold -> false
NEqEL : Hold = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (Hold, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (Hold, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (Hold, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (Hold, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 false
 < backchain NEqHE.

Subgoal 2.3.2.2.2.2.2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
============================
 remove_all [] Hold []
 < search.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < LS': assert lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal).

Subgoal 2.4:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
============================
 lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
 < apply replaceScopes_lookupScopes_same to EvBody1A1.

Subgoal 2.4:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
H1 : lookupScopes L G' (consVal H LVal)
============================
 lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
 < search.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < apply lookupScopes_is to _ LS.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < Is: case IsCtx (keep).

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < Is: case Is.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal H (consVal Hd Tl))
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < Is: case Is.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
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 (consVal H (consVal Hd Tl))
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < Is: case Is3.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
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 H
Is4 : is_value (consVal Hd Tl)
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < Is: case Is4.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
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 H
Is4 : is_value Hd
Is5 : is_value Tl
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < Is: case Is2.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is6 : is_list (is_pair is_string is_value) [(SaveE, V)]
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < Is: case Is2.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is6 : is_list (is_pair is_string is_value) [(SaveE, V)]
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < Is: case Is6.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is6 : is_pair is_string is_value (SaveE, V)
Is8 : is_list (is_pair is_string is_value) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < Is: case Is6.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < EvBody1A': apply drop_proj_rel_evalStmt to EvBody1A.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < apply evalStmt_isCtx to _ _ _ EvBody1A'.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G'))
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < EvBody1B': apply drop_proj_rel_evalStmt to EvBody1B.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G'))
EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < IsG'+: apply evalStmt_isCtx to _ _ _ EvBody1B'.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G'))
EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G'))
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < case IsG'+.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G'
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G'))
EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
H4 : is_list (is_pair is_string is_value) []
H5 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < EvB: apply IH to ListyH _ _ _ _ _ _ _ _ _ with
          Hold = Hold
          SaveI = SaveI
          SaveE = SaveE L = L V = V H = Hd LVal = consVal H LVal G = G' FE = FE.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G' G'1 LV
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G'))
EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
H4 : is_list (is_pair is_string is_value) []
H5 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')
EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvB1 : replaceScopes L LV G' G'1
EvB2 : flipOnto (consVal Hd Tl) (consVal H LVal) LV
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < exists G'1,
   LV.

Subgoal 2:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G' G'1 LV
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G'))
EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
H4 : is_list (is_pair is_string is_value) []
H5 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')
EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvB1 : replaceScopes L LV G' G'1
EvB2 : flipOnto (consVal Hd Tl) (consVal H LVal) LV
============================
 (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\
 replaceScopes L LV G G'1) /\
 flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < split.

Subgoal 2.5:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G' G'1 LV
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G'))
EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
H4 : is_list (is_pair is_string is_value) []
H5 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')
EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvB1 : replaceScopes L LV G' G'1
EvB2 : flipOnto (consVal Hd Tl) (consVal H LVal) LV
============================
 <evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
 < search 6.

Subgoal 2.6:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G' G'1 LV
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G'))
EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
H4 : is_list (is_pair is_string is_value) []
H5 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')
EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvB1 : replaceScopes L LV G' G'1
EvB2 : flipOnto (consVal Hd Tl) (consVal H LVal) LV
============================
 replaceScopes L LV G G'1
 < apply replaceScopes_twice to EvBody1A1 EvB1.

Subgoal 2.6:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G' G'1 LV
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G'))
EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
H4 : is_list (is_pair is_string is_value) []
H5 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')
EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvB1 : replaceScopes L LV G' G'1
EvB2 : flipOnto (consVal Hd Tl) (consVal H LVal) LV
H6 : replaceScopes L LV G G'1
============================
 replaceScopes L LV G G'1
 < search.

Subgoal 2.7:

Variables: Hold SaveI SaveE L V H LVal G FE Tl Hd G' G'1 LV
IH : forall Hold SaveI SaveE L V H 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, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) ->
       (Hold = SaveI -> false) -> (Hold = L -> false) -> (SaveI = SaveE -> false) ->
       (SaveI = L -> false) -> (Hold = SaveE -> false) -> (SaveE = L -> false) ->
       lookupScopes L ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) LVal ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto (consVal H HoldL) 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, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)
NEqHI : Hold = SaveI -> false
NEqHL : Hold = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : Hold = SaveE -> false
NEqEL : SaveE = L -> false
LS : lookupScopes L ([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G) LVal
ListyH : listy Tl *
EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
EvBody1A1 : replaceScopes L (consVal H LVal) G G'
EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (consVal H LVal)
H1 : is_value LVal
H2 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value H
Is4 : is_value Hd
Is5 : is_value Tl
Is2 : is_string SaveI
Is7 : is_value (intVal 0)
Is8 : is_list (is_pair is_string is_value) []
Is6 : is_string SaveE
Is9 : is_value V
EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) []
H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G'))
EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, intVal 0), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')) []
H4 : is_list (is_pair is_string is_value) []
H5 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G')
EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvB1 : replaceScopes L LV G' G'1
EvB2 : flipOnto (consVal Hd Tl) (consVal H LVal) LV
============================
 flipOnto (consVal H (consVal Hd Tl)) LVal LV
 < search.

Proof completed.
 < Theorem proj_listUpdate_eval :
     forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL -> (Hold = SaveI -> false) -> (Hold = L -> false) ->
       (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) ->
       (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV.

============================
 forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
   updateListIndex OldL I V NewL -> (Hold = SaveI -> false) -> (Hold = L -> false) ->
   (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) ->
   (SaveE = L -> 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) ->
   lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV,
     (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
     replaceScopes L LV G G') /\
     flipOnto HoldL NewL LV
 < induction on 1.

IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
============================
 forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
   updateListIndex OldL I V NewL @ -> (Hold = SaveI -> false) -> (Hold = L -> false) ->
   (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE -> false) ->
   (SaveE = L -> 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) ->
   lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL -> exists G' LV,
     (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
     replaceScopes L LV G G') /\
     flipOnto HoldL NewL LV
 < intros ULI NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL ListyH GEqI0 IsFE Is+ LS.

Variables: OldL I V NewL Hold HoldL SaveI SaveE G FE L
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL NewL LV
 < ULI: case ULI.

Subgoal 1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal V Tl) LV
 < EvLoop1: assert <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) [].

Subgoal 1.1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
============================
 <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
 < search 6.

Subgoal 1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal V Tl) LV
 < EvMid_e: assert <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [].

Subgoal 1.2:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
 < EvCP: assert exists VE,
     <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (eq (name SaveE) (tail (name L))) VE [].

Subgoal 1.2.1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
============================
 exists VE,
   <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (eq (name SaveE) (tail (name L))) VE []
 < IsV: apply lookupScopes_is to Is+ _ with
          X = SaveE V = V.

Subgoal 1.2.1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsV : is_value V
IsV1 : is_string SaveE
============================
 exists VE,
   <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (eq (name SaveE) (tail (name L))) VE []
 < IsLVal: apply lookupScopes_is to _ LS.

Subgoal 1.2.1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsV : is_value V
IsV1 : is_string SaveE
IsLVal : is_value (consVal VOld Tl)
IsLVal1 : is_string L
============================
 exists VE,
   <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (eq (name SaveE) (tail (name L))) VE []
 < IsLV: case IsLVal.

Subgoal 1.2.1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsV : is_value V
IsV1 : is_string SaveE
IsLVal1 : is_string L
IsLV : is_value VOld
IsLV1 : is_value Tl
============================
 exists VE,
   <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (eq (name SaveE) (tail (name L))) VE []
 < Or: apply is_value_eq_or_not to IsV IsLV1.

Subgoal 1.2.1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsV : is_value V
IsV1 : is_string SaveE
IsLVal1 : is_string L
IsLV : is_value VOld
IsLV1 : is_value Tl
Or : V = Tl \/ (V = Tl -> false)
============================
 exists VE,
   <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (eq (name SaveE) (tail (name L))) VE []
 < N: case Or.

Subgoal 1.2.1.1:

Variables: Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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, Tl)]::G)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, Tl)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, Tl)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, Tl)]::G) []
IsV : is_value Tl
IsV1 : is_string SaveE
IsLVal1 : is_string L
IsLV : is_value VOld
IsLV1 : is_value Tl
============================
 exists VE,
   <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, Tl)]::G) (eq (name SaveE) (tail (name L))) VE []
 < search 20.

Subgoal 1.2.1.2:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
IsV : is_value V
IsV1 : is_string SaveE
IsLVal1 : is_string L
IsLV : is_value VOld
IsLV1 : is_value Tl
N : V = Tl -> false
============================
 exists VE,
   <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (eq (name SaveE) (tail (name L))) VE []
 < search 20.

Subgoal 1.2:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvCP : exists VE,
         <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (eq (name SaveE) (tail (name L))) VE []
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
 < case EvCP.

Subgoal 1.2:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
H1 : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (eq (name SaveE) (tail (name L))) VE []
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
 < search 20.

Subgoal 1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal V Tl) LV
 < EvAssign: assert exists G',
     <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
     replaceScopes L (consVal V Tl) G G'.

Subgoal 1.3:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (consVal V Tl) G G'
 < IsL: apply lookupScopes_is to _ LS.

Subgoal 1.3:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (consVal V Tl) G G'
 < RS: apply lookupScopes_replaceScopes_exists to _ _ LS with
         V' = consVal V Tl.

Subgoal 1.3:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld R
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
RS : replaceScopes L (consVal V Tl) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) R
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (consVal V Tl) G G'
 < RS: case RS (keep).

Subgoal 1.3.1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld I1 LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
RS : replaceScopes L (consVal V Tl) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal V Tl)::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) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (consVal V Tl) G G'
 < M: case RS1.

Subgoal 1.3.1.1:

Variables: V Hold HoldL SaveI SaveE G FE Tl VOld LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes Hold ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name Hold)) (name Hold))) (assign Hold (tail (name Hold)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name Hold))) (consVal V Tl) []
IsL : is_value (consVal VOld Tl)
IsL1 : is_string Hold
RS : replaceScopes Hold (consVal V Tl) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((Hold, consVal V Tl)::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) (assign Hold (cons (name SaveE) (tail (name Hold)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes Hold (consVal V Tl) G G'
 < apply NEqHL to _.

Subgoal 1.3.1.2:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld I1 LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
RS : replaceScopes L (consVal V Tl) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal V Tl)::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) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (consVal V Tl) G G'
 < M: case M.

Subgoal 1.3.1.2.1:

Variables: V Hold HoldL SaveI SaveE G FE Tl VOld LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes SaveI ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name SaveI)) (name Hold))) (assign SaveI (tail (name SaveI)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name SaveI))) (consVal V Tl) []
IsL : is_value (consVal VOld Tl)
IsL1 : is_string SaveI
RS : replaceScopes SaveI (consVal V Tl) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((SaveI, consVal V Tl)::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) (assign SaveI (cons (name SaveE) (tail (name SaveI)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes SaveI (consVal V Tl) G G'
 < apply NEqIL to _.

Subgoal 1.3.1.2.2:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld I1 LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
RS : replaceScopes L (consVal V Tl) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal V Tl)::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) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (consVal V Tl) G G'
 < M: case M.

Subgoal 1.3.1.2.2.1:

Variables: V Hold HoldL SaveI SaveE G FE Tl VOld LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name SaveE)) (name Hold))) (assign SaveE (tail (name SaveE)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name SaveE))) (consVal V Tl) []
IsL : is_value (consVal VOld Tl)
IsL1 : is_string SaveE
RS : replaceScopes SaveE (consVal V Tl) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((SaveE, consVal V Tl)::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) (assign SaveE (cons (name SaveE) (tail (name SaveE)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes SaveE (consVal V Tl) G G'
 < apply NEqEL to _.

Subgoal 1.3.1.2.2.2:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld I1 LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
RS : replaceScopes L (consVal V Tl) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (((L, consVal V Tl)::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) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (consVal V Tl) G G'
 < case M.

Subgoal 1.3.2:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
RS : replaceScopes L (consVal V Tl) ([(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 (consVal V Tl) G New
============================
 exists G',
   <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L (consVal V Tl) G G'
 < search.

Subgoal 1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : exists G',
             <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
             replaceScopes L (consVal V Tl) G G'
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal V Tl) LV
 < EvAssign: case EvAssign.

Subgoal 1:

Variables: V Hold HoldL SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal V Tl) LV
 < ListyH': case ListyH (keep).

Subgoal 1.4:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto nilVal (consVal V Tl) LV
 < exists G',
   consVal V Tl.

Subgoal 1.4:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 (<evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 replaceScopes L (consVal V Tl) G G') /\
 flipOnto nilVal (consVal V Tl) (consVal V Tl)
 < split.

Subgoal 1.4.1:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
 < unfold .

Subgoal 1.4.1:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 exists EE1 O1 O2,
   <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 O1 /\
   (<evalStmt {P}> FE EE1 (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') O2 /\
   O1 ++ O2 = [])
 < exists [(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G,
   [],
   [].

Subgoal 1.4.1:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) [] /\
 (<evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 [] ++ [] = [])
 < split.

Subgoal 1.4.1.1:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
 < search.

Subgoal 1.4.1.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
 < unfold .

Subgoal 1.4.1.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 exists EE1 O1 O2,
   <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) EE1 O1 /\
   (<evalStmt {P}> FE EE1 (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') O2 /\
   O1 ++ O2 = [])
 < exists [(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G',
   [],
   [].

Subgoal 1.4.1.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 (<evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 [] ++ [] = [])
 < split.

Subgoal 1.4.1.2.1:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
 < search.

Subgoal 1.4.1.2.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
 < search 6.

Subgoal 1.4.1.2.3:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 [] ++ [] = []
 < search.

Subgoal 1.4.1.3:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 [] ++ [] = []
 < search.

Subgoal 1.4.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 replaceScopes L (consVal V Tl) G G'
 < search.

Subgoal 1.4.3:

Variables: V Hold SaveI SaveE G FE L Tl VOld G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy nilVal
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, nilVal), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
============================
 flipOnto nilVal (consVal V Tl) (consVal V Tl)
 < search.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < LS': assert lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl).

Subgoal 1.5.1:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
============================
 lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
 < apply replaceScopes_lookupScopes_same to EvAssign1.

Subgoal 1.5.1:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
H1 : lookupScopes L G' (consVal V Tl)
============================
 lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
 < search.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < IsL: apply lookupScopes_is to _ LS.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G)
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < Is: case Is+.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is : is_list (is_pair is_string is_value) [(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]
Is1 : is_list (is_list (is_pair is_string is_value)) G
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < Is: case Is.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal 0), (SaveE, V)]
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < Is: case Is2.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
Is2 : is_pair is_string is_value (SaveI, intVal 0)
Is3 : is_list (is_pair is_string is_value) [(SaveE, V)]
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < Is: case Is3.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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,
   (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < Is: case Is3.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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,
   (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < EvAsgn': apply drop_proj_rel_evalStmt to EvAssign.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < apply evalStmt_isCtx to _ _ _ EvAsgn'.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < EvLoop2: apply eval_update_loop2 to _ _ _ _ _ _ _ _ _ _ with
              Hold = Hold
              SaveI = SaveI
              SaveE = SaveE
              L = L V = V H = Hd HoldL = Tl1 LVal = consVal V Tl G = G' FE = FE.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < exists G'1,
   LV.

Subgoal 1.5:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\
 replaceScopes L LV G G'1) /\
 flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < split.

Subgoal 1.5.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
 < unfold .

Subgoal 1.5.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 exists EE1 O1 O2,
   <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 O1 /\
   (<evalStmt {P}> FE EE1 (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) O2 /\
   O1 ++ O2 = [])
 < exists [(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G,
   [],
   [].

Subgoal 1.5.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) [] /\
 (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\
 [] ++ [] = [])
 < split.

Subgoal 1.5.2.1:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
 < search.

Subgoal 1.5.2.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
 < unfold .

Subgoal 1.5.2.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 exists EE1 O1 O2,
   <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) EE1 O1 /\
   (<evalStmt {P}> FE EE1 (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) O2 /\
   O1 ++ O2 = [])
 < exists [(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G',
   [],
   [].

Subgoal 1.5.2.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
 (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\
 [] ++ [] = [])
 < split.

Subgoal 1.5.2.2.1:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
 < search.

Subgoal 1.5.2.2.2:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
 < search.

Subgoal 1.5.2.2.3:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 [] ++ [] = []
 < search.

Subgoal 1.5.2.3:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 [] ++ [] = []
 < search.

Subgoal 1.5.3:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 replaceScopes L LV G G'1
 < apply replaceScopes_twice to EvAssign1 EvLoop3.

Subgoal 1.5.3:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
H2 : replaceScopes L LV G G'1
============================
 replaceScopes L LV G G'1
 < search.

Subgoal 1.5.4:

Variables: V Hold SaveI SaveE G FE L Tl VOld G' Tl1 Hd G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal Hd Tl1)
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
LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (consVal VOld Tl)
EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) []
EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []
EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
EvAssign1 : replaceScopes L (consVal V Tl) G G'
ListyH' : listy Tl1
LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (consVal V Tl)
IsL : is_value (consVal VOld Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_pair is_string is_value (Hold, consVal Hd Tl1)
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
EvAsgn' : evalStmt FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') []
H1 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G')
EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, intVal 0), (SaveE, V)]::G') (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop3 : replaceScopes L LV G' G'1
EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV
============================
 flipOnto (consVal Hd Tl1) (consVal V Tl) LV
 < search.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < GEqI1: apply updateListIndex_pos to ULI1.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < EvCond: assert <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [].

Subgoal 2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
 < unfold .

Subgoal 2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
============================
 exists I1 O1 I2 O2,
   <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (name SaveI) (intVal I1) O1 /\
   (<evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (num 0) (intVal I2) O2 /\
   (I1 > I2 /\ O1 ++ O2 = []))
 < exists I,
   [],
   0,
   [].

Subgoal 2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (name SaveI) (intVal I) [] /\
 (<evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (num 0) (intVal 0) [] /\
 (I > 0 /\ [] ++ [] = []))
 < split.

Subgoal 2.1.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (name SaveI) (intVal I) []
 < search.

Subgoal 2.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
============================
 <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (num 0) (intVal 0) []
 < search.

Subgoal 2.1.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
============================
 I > 0
 < Or: apply greatereq_integer_greater_or_eq to GEqI0.

Subgoal 2.1.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
Or : I > 0 \/ I = 0
============================
 I > 0
 < C: case Or.

Subgoal 2.1.3.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
C : I > 0
============================
 I > 0
 < search.

Subgoal 2.1.3.2:

Variables: V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal X Tl)
ULI : 0 - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
============================
 0 > 0
 < compute ULI.

Subgoal 2.1.3.2:

Variables: V Hold HoldL SaveI SaveE G FE L TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal X Tl)
ULI : 0 - 1 = -1
ULI1 : updateListIndex Tl -1 V TlNew *
GEqI1 : -1 >= 0
============================
 0 > 0
 < LEq: case GEqI1.

Subgoal 2.1.3.2:

Variables: V Hold HoldL SaveI SaveE G FE L TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal 0), (SaveE, V)]::G) (consVal X Tl)
ULI : 0 - 1 = -1
ULI1 : updateListIndex Tl -1 V TlNew *
LEq : 0 <= -1
============================
 0 > 0
 < case LEq.

Subgoal 2.1.4:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
============================
 [] ++ [] = []
 < search.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) 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.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 <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.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 exists V1,
   <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) V1 [] /\
   replaceScopes SaveI V1 ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
 < exists intVal I1.

Subgoal 2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) (intVal I1) [] /\
 replaceScopes SaveI (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
 < split.

Subgoal 2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) (intVal I1) []
 < unfold .

Subgoal 2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 exists I2 O1 I3 O2,
   <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (name SaveI) (intVal I2) O1 /\
   (<evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (num 1) (intVal I3) O2 /\
   (I2 - I3 = I1 /\ O1 ++ O2 = []))
 < exists I,
   [],
   1,
   [].

Subgoal 2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (name SaveI) (intVal I) [] /\
 (<evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (num 1) (intVal 1) [] /\
 (I - 1 = I1 /\ [] ++ [] = []))
 < split.

Subgoal 2.2.1.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (name SaveI) (intVal I) []
 < search.

Subgoal 2.2.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (num 1) (intVal 1) []
 < search.

Subgoal 2.2.1.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 I - 1 = I1
 < search.

Subgoal 2.2.1.4:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 [] ++ [] = []
 < search.

Subgoal 2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 replaceScopes SaveI (intVal I1) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G))
 < unfold .

Subgoal 2.2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 no_lookup [] SaveI
 < search.

Subgoal 2.2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 replaceScopes SaveI (intVal I1) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)
 < unfold .

Subgoal 2.2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 exists I1,
   mem (SaveI, I1) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] /\
   remove_all [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] SaveI [(Hold, HoldL), (SaveE, V)]
 < exists intVal I.

Subgoal 2.2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 mem (SaveI, intVal I) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] /\
 remove_all [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] SaveI [(Hold, HoldL), (SaveE, V)]
 < split.

Subgoal 2.2.2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 mem (SaveI, intVal I) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
 < search.

Subgoal 2.2.2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 remove_all [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] SaveI [(Hold, HoldL), (SaveE, V)]
 < unfold .

Subgoal 2.2.2.2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 Hold = SaveI -> false
 < intros E.

Subgoal 2.2.2.2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
E : Hold = SaveI
============================
 false
 < case E.

Subgoal 2.2.2.2.2.1:

Variables: I V HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         replaceScopes L LV G G') /\
         flipOnto HoldL NewL LV
NEqHI : SaveI = SaveI -> false
NEqHL : SaveI = L -> false
NEqIE : SaveI = SaveE -> false
NEqIL : SaveI = L -> false
NEqHE : SaveI = SaveE -> false
NEqEL : SaveE = L -> 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)) ([(SaveI, HoldL), (SaveI, intVal I), (SaveE, V)]::G)
LS : lookupScopes L ([(SaveI, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(SaveI, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 false
 < backchain NEqHI.

Subgoal 2.2.2.2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 remove_all [(SaveI, intVal I), (SaveE, V)] SaveI [(SaveE, V)]
 < unfold .

Subgoal 2.2.2.2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 remove_all [(SaveE, V)] SaveI [(SaveE, V)]
 < unfold .

Subgoal 2.2.2.2.2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 SaveE = SaveI -> false
 < intros E.

Subgoal 2.2.2.2.2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
E : SaveE = SaveI
============================
 false
 < case E.

Subgoal 2.2.2.2.2.2.1:

Variables: I V Hold HoldL SaveI G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveI, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 false
 < backchain NEqIE.

Subgoal 2.2.2.2.2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
============================
 remove_all [] SaveI []
 < search.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < EvBodyB: assert <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) [].

Subgoal 2.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
 < EvL: assert <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) [].

Subgoal 2.3.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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) (consVal X Tl) []
 < LS: case LS.

Subgoal 2.3.1.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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 (consVal X Tl)
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
 < L: case LS.

Subgoal 2.3.1.1.1:

Variables: I V SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal X Tl)
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, consVal X Tl), (SaveI, intVal I), (SaveE, V)]::G)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(L, consVal X Tl), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyA : <evalStmt {P}> FE ([]::([(L, consVal X Tl), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (L, consVal X Tl), (SaveE, V)]::G)) []
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (L, consVal X Tl), (SaveE, V)]::G)) (name L) (consVal X Tl) []
 < apply NEqHL to _.

Subgoal 2.3.1.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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 (consVal X Tl)
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
 < L: case L1.

Subgoal 2.3.1.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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 : SaveI = L -> false
L2 : lookup [(SaveE, V)] L (consVal X Tl)
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
 < L: case L2.

Subgoal 2.3.1.1.2.1:

Variables: I Hold HoldL SaveI G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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, consVal X Tl)]::G)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 (consVal X Tl) TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, consVal X Tl)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (L, consVal X Tl)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, consVal X Tl)]::G)) []
L : Hold = L -> false
L1 : SaveI = L -> false
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, consVal X Tl)]::G)) (name L) (consVal X Tl) []
 < apply NEqEL to _.

Subgoal 2.3.1.1.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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 : SaveI = L -> false
L2 : SaveE = L -> false
L3 : lookup [] L (consVal X Tl)
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
 < case L3.

Subgoal 2.3.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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 (consVal X Tl)
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
 < assert no_lookup [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)] L.

Subgoal 2.3.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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 (consVal X Tl)
H1 : no_lookup [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)] L
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
 < search.

Subgoal 2.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
============================
 <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
 < EvCP: assert exists VE,
     <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE [].

Subgoal 2.3.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
 < IsC: case Is+ (keep).

Subgoal 2.3.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
IsC : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
IsC1 : is_list (is_list (is_pair is_string is_value)) G
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
 < IsC: case IsC.

Subgoal 2.3.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC : is_pair is_string is_value (Hold, HoldL)
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
 < IsH: case IsC.

Subgoal 2.3.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
IsH : is_string Hold
IsH1 : is_value HoldL
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
 < IsL: apply lookupScopes_is to _ LS.

Subgoal 2.3.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
IsH : is_string Hold
IsH1 : is_value HoldL
IsL : is_value (consVal X Tl)
IsL1 : is_string L
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
 < IsL: case IsL.

Subgoal 2.3.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
IsH : is_string Hold
IsH1 : is_value HoldL
IsL1 : is_string L
IsL : is_value X
IsL2 : is_value Tl
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
 < assert SaveI = Hold -> false.

Subgoal 2.3.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
IsH : is_string Hold
IsH1 : is_value HoldL
IsL1 : is_string L
IsL : is_value X
IsL2 : is_value Tl
============================
 SaveI = Hold -> false
 < intros E.

Subgoal 2.3.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
IsH : is_string Hold
IsH1 : is_value HoldL
IsL1 : is_string L
IsL : is_value X
IsL2 : is_value Tl
E : SaveI = Hold
============================
 false
 < case E.

Subgoal 2.3.2.1:

Variables: I V Hold HoldL SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (greater (name Hold) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(Hold, intVal I), (SaveE, V)]
IsH : is_string Hold
IsH1 : is_value HoldL
IsL1 : is_string L
IsL : is_value X
IsL2 : is_value Tl
============================
 false
 < backchain NEqHI.

Subgoal 2.3.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
IsH : is_string Hold
IsH1 : is_value HoldL
IsL1 : is_string L
IsL : is_value X
IsL2 : is_value Tl
H1 : SaveI = Hold -> false
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
 < Or: apply is_value_eq_or_not to IsL IsH1.

Subgoal 2.3.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
IsH : is_string Hold
IsH1 : is_value HoldL
IsL1 : is_string L
IsL : is_value X
IsL2 : is_value Tl
H1 : SaveI = Hold -> false
Or : X = HoldL \/ (X = HoldL -> false)
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
 < N: case Or.

Subgoal 2.3.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal HoldL Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal HoldL Tl) []
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
IsH : is_string Hold
IsH1 : is_value HoldL
IsL1 : is_string L
IsL : is_value HoldL
IsL2 : is_value Tl
H1 : SaveI = Hold -> false
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
 < search 20.

Subgoal 2.3.2.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
IsC1 : is_list (is_list (is_pair is_string is_value)) G
IsC2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
IsH : is_string Hold
IsH1 : is_value HoldL
IsL1 : is_string L
IsL : is_value X
IsL2 : is_value Tl
H1 : SaveI = Hold -> false
N : X = HoldL -> false
============================
 exists VE,
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
 < search 20.

Subgoal 2.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
EvCP : exists VE,
         <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
 < case EvCP.

Subgoal 2.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
 < unfold .

Subgoal 2.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 exists V1,
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (cons (head (name L)) (name Hold)) V1 [] /\
   replaceScopes Hold V1 ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G))
 < exists consVal X HoldL.

Subgoal 2.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (cons (head (name L)) (name Hold)) (consVal X HoldL) [] /\
 replaceScopes Hold (consVal X HoldL) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G))
 < split.

Subgoal 2.3.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (cons (head (name L)) (name Hold)) (consVal X HoldL) []
 < unfold .

Subgoal 2.3.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 exists E_P V_P O_P O1 O2,
   (<evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (head (name L)) X O1 /\
   (<evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL O2 /\
   O1 ++ O2 = [])) /\
   (|{expr}- cons (head (name L)) (name Hold) ~~> E_P /\
   <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) E_P V_P O_P)
 < exists eq (head (name L)) (name Hold),
   VE,
   [],
   [],
   [].

Subgoal 2.3.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 (<evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (head (name L)) X [] /\
 (<evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL [] /\
 [] ++ [] = [])) /\
 (|{expr}- cons (head (name L)) (name Hold) ~~> eq (head (name L)) (name Hold) /\
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE [])
 < split.

Subgoal 2.3.3.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (head (name L)) X []
 < search.

Subgoal 2.3.3.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL []
 < assert lookupScopes Hold ([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G) HoldL.

Subgoal 2.3.3.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 lookupScopes Hold ([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G) HoldL
 < unfold .

Subgoal 2.3.3.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 lookup [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)] Hold HoldL
 < unfold .

Subgoal 2.3.3.2.1.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 SaveI = Hold -> false
 < intros E.

Subgoal 2.3.3.2.1.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
E : SaveI = Hold
============================
 false
 < case E.

Subgoal 2.3.3.2.1.1:

Variables: I V Hold HoldL SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (greater (name Hold) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 false
 < backchain NEqHI.

Subgoal 2.3.3.2.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 lookup [(Hold, HoldL), (SaveE, V)] Hold HoldL
 < search.

Subgoal 2.3.3.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
H2 : lookupScopes Hold ([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G) HoldL
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL []
 < search.

Subgoal 2.3.3.3:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 [] ++ [] = []
 < search.

Subgoal 2.3.3.4:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 |{expr}- cons (head (name L)) (name Hold) ~~> eq (head (name L)) (name Hold)
 < search.

Subgoal 2.3.3.5:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
 < search.

Subgoal 2.3.4:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 replaceScopes Hold (consVal X HoldL) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G))
 < unfold .

Subgoal 2.3.4.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 no_lookup [] Hold
 < search.

Subgoal 2.3.4.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 replaceScopes Hold (consVal X HoldL) ([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)
 < unfold .

Subgoal 2.3.4.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 exists I,
   mem (Hold, I) [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)] /\
   remove_all [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)] Hold [(SaveI, intVal I1), (SaveE, V)]
 < exists HoldL.

Subgoal 2.3.4.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 mem (Hold, HoldL) [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)] /\
 remove_all [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)] Hold [(SaveI, intVal I1), (SaveE, V)]
 < split.

Subgoal 2.3.4.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 mem (Hold, HoldL) [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]
 < search.

Subgoal 2.3.4.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 remove_all [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)] Hold [(SaveI, intVal I1), (SaveE, V)]
 < unfold .

Subgoal 2.3.4.2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 SaveI = Hold -> false
 < intros E.

Subgoal 2.3.4.2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
E : SaveI = Hold
============================
 false
 < case E.

Subgoal 2.3.4.2.2.1:

Variables: I V Hold HoldL SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (Hold, intVal I), (SaveE, V)]::G) (greater (name Hold) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(Hold, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 false
 < backchain NEqHI.

Subgoal 2.3.4.2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 remove_all [(Hold, HoldL), (SaveE, V)] Hold [(SaveE, V)]
 < unfold .

Subgoal 2.3.4.2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 remove_all [(SaveE, V)] Hold [(SaveE, V)]
 < unfold .

Subgoal 2.3.4.2.2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 SaveE = Hold -> false
 < intros E.

Subgoal 2.3.4.2.2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
E : SaveE = Hold
============================
 false
 < case E.

Subgoal 2.3.4.2.2.2.1:

Variables: I V Hold HoldL SaveI G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (Hold, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (Hold, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 false
 < backchain NEqHE.

Subgoal 2.3.4.2.2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl VE
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) []
EvL : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
H1 : <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (eq (head (name L)) (name Hold)) VE []
============================
 remove_all [] Hold []
 < search.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < EvBodyC: assert exists G',
     <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
     replaceScopes L Tl G G'.

Subgoal 2.4:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
   replaceScopes L Tl G G'
 < IsL: apply lookupScopes_is to _ LS.

Subgoal 2.4:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
   replaceScopes L Tl G G'
 < RS: apply lookupScopes_replaceScopes_exists to _ _ LS with
         V' = Tl.

Subgoal 2.4:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl R
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) R
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
   replaceScopes L Tl G G'
 < RS: case RS (keep).

Subgoal 2.4.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl I2 LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (((L, Tl)::LRemain)::G)
RS1 : mem (L, I2) [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
   replaceScopes L Tl G G'
 < M: case RS1.

Subgoal 2.4.1.1:

Variables: I V Hold HoldL SaveI SaveE G FE I1 TlNew X Tl LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes Hold ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name Hold)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string Hold
RS : replaceScopes Hold Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (((Hold, Tl)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] Hold LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
   replaceScopes Hold Tl G G'
 < apply NEqHL to _.

Subgoal 2.4.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl I2 LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (((L, Tl)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L LRemain
M : mem (L, I2) [(SaveI, intVal I), (SaveE, V)]
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
   replaceScopes L Tl G G'
 < M: case M.

Subgoal 2.4.1.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE I1 TlNew X Tl LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes SaveI ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name SaveI)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string SaveI
RS : replaceScopes SaveI Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (((SaveI, Tl)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] SaveI LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign SaveI (tail (name SaveI))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
   replaceScopes SaveI Tl G G'
 < apply NEqIL to _.

Subgoal 2.4.1.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl I2 LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (((L, Tl)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L LRemain
M : mem (L, I2) [(SaveE, V)]
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
   replaceScopes L Tl G G'
 < M: case M.

Subgoal 2.4.1.2.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE I1 TlNew X Tl LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes SaveE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name SaveE)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string SaveE
RS : replaceScopes SaveE Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (((SaveE, Tl)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] SaveE LRemain
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign SaveE (tail (name SaveE))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
   replaceScopes SaveE Tl G G'
 < apply NEqEL to _.

Subgoal 2.4.1.2.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl I2 LRemain
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (((L, Tl)::LRemain)::G)
RS2 : remove_all [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L LRemain
M : mem (L, I2) []
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
   replaceScopes L Tl G G'
 < case M.

Subgoal 2.4.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
============================
 exists G',
   <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
   replaceScopes L Tl G G'
 < exists New.

Subgoal 2.4.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
============================
 <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::New)) [] /\
 replaceScopes L Tl G New
 < split.

Subgoal 2.4.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
============================
 <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::New)) []
 < unfold .

Subgoal 2.4.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
============================
 exists V1,
   <evalExpr {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) V1 [] /\
   replaceScopes L V1 ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::New))
 < exists Tl.

Subgoal 2.4.2.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl [] /\
 replaceScopes L Tl ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::New))
 < split.

Subgoal 2.4.2.1.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl []
 < LS: case LS.

Subgoal 2.4.2.1.1.1:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
LS : lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L (consVal X Tl)
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl []
 < L: case LS.

Subgoal 2.4.2.1.1.1.1:

Variables: I V SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
ListyH : listy (consVal X Tl)
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, consVal X Tl), (SaveI, intVal I), (SaveE, V)]::G)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(L, consVal X Tl), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyA : <evalStmt {P}> FE ([]::([(L, consVal X Tl), (SaveI, intVal I), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (L, consVal X Tl), (SaveE, V)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (L, consVal X Tl), (SaveE, V)]::G)) (assign L (cons (head (name L)) (name L))) ([]::([(L, consVal X (consVal X Tl)), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(L, consVal X Tl), (SaveI, intVal I), (SaveE, V)]::G) ([(L, consVal X Tl), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(L, consVal X Tl), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
============================
 <evalExpr {P}> FE ([]::([(L, consVal X (consVal X Tl)), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl []
 < apply NEqHL to _.

Subgoal 2.4.2.1.1.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
L : Hold = L -> false
L1 : lookup [(SaveI, intVal I), (SaveE, V)] L (consVal X Tl)
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl []
 < L: case L1.

Subgoal 2.4.2.1.1.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
L : Hold = L -> false
L1 : SaveI = L -> false
L2 : lookup [(SaveE, V)] L (consVal X Tl)
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl []
 < apply NEqIL to _.

Subgoal 2.4.2.1.1.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
L : Hold = L -> false
L1 : SaveI = L -> false
L2 : lookup [(SaveE, V)] L (consVal X Tl)
============================
 SaveI = L
 < L: case L2.

Subgoal 2.4.2.1.1.1.2.1:

Variables: I Hold HoldL SaveI G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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, consVal X Tl)]::G)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 (consVal X Tl) TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (L, consVal X Tl)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (L, consVal X Tl)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, consVal X Tl)]::G)) []
EvBodyB : <evalStmt {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (L, consVal X Tl)]::G)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (L, consVal X Tl)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (L, consVal X Tl)]::G) ([(Hold, HoldL), (SaveI, intVal I), (L, consVal X Tl)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (L, consVal X Tl)] L
RS2 : replaceScopes L Tl G New
L : Hold = L -> false
L1 : SaveI = L -> false
============================
 SaveI = L
 < apply NEqEL to _.

Subgoal 2.4.2.1.1.1.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
L : Hold = L -> false
L1 : SaveI = L -> false
L2 : SaveE = L -> false
L3 : lookup [] L (consVal X Tl)
============================
 SaveI = L
 < case L3.

Subgoal 2.4.2.1.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
LS : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
LS1 : lookupScopes L G (consVal X Tl)
============================
 <evalExpr {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl []
 < search 8.

Subgoal 2.4.2.1.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
============================
 replaceScopes L Tl ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::New))
 < search 6.

Subgoal 2.4.2.2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl New
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
IsL : is_value (consVal X Tl)
IsL1 : is_string L
RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::New)
RS1 : no_lookup [(Hold, HoldL), (SaveI, intVal I), (SaveE, V)] L
RS2 : replaceScopes L Tl G New
============================
 replaceScopes L Tl G New
 < search.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
EvBodyC : exists G',
            <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [] /\
            replaceScopes L Tl G G'
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < EvBodyC: case EvBodyC.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
EvBodyC : <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
EvBodyC1 : replaceScopes L Tl G G'
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < EvBody: assert <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) [].

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
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)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) []
EvBodyC : <evalStmt {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (assign L (tail (name L))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < clear EvBodyA
   EvBodyB
   EvBodyC.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < ListyH': assert listy (consVal X HoldL).

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < IsL: apply lookupScopes_is to _ LS.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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)
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL : is_value (consVal X Tl)
IsL1 : is_string L
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < Is: case Is+.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL : is_value (consVal X Tl)
IsL1 : 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,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < Is: case Is.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL : is_value (consVal X Tl)
IsL1 : is_string L
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, intVal I), (SaveE, V)]
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < Is: case Is.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL : is_value (consVal X Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is2 : is_list (is_pair is_string is_value) [(SaveI, intVal I), (SaveE, V)]
Is : is_string Hold
Is3 : is_value HoldL
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < Is: case Is2.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL : is_value (consVal X Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_pair is_string is_value (SaveI, intVal I)
Is4 : is_list (is_pair is_string is_value) [(SaveE, V)]
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < Is: case Is2.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL : is_value (consVal X Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is4 : is_list (is_pair is_string is_value) [(SaveE, V)]
Is2 : is_string SaveI
Is5 : is_value (intVal I)
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < Is: case Is4.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL : is_value (consVal X Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is5 : is_value (intVal I)
Is4 : is_pair is_string is_value (SaveE, V)
Is6 : is_list (is_pair is_string is_value) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < Is: case Is4.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL : is_value (consVal X Tl)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is5 : is_value (intVal I)
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < case IsL.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is5 : is_value (intVal I)
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < case Is5.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < apply minus_integer_is_integer to _ _ ULI.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < EvBody': apply drop_proj_rel_evalStmt to EvBody.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < IsG'+: apply evalStmt_isCtx to _ _ _ EvBody'.

Subgoal 2.5:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
============================
 is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G))
 < search 6.

Subgoal 2.6:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
============================
 is_stmt (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))
 < search 8.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G'))
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < case IsG'+.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < IsG'+: assert is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G').

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < assert lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl.

Subgoal 2.7:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
============================
 lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
 < apply replaceScopes_lookupScopes_same to EvBodyC1.

Subgoal 2.7:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L G' Tl
============================
 lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
 < search.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G'
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < Sub: apply IH to ULI1 NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL ListyH' _ _ IsG'+ _.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G' G'1 LV
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
Sub : <evalStmt {P}> FE ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
Sub1 : replaceScopes L LV G' G'1
Sub2 : flipOnto (consVal X HoldL) TlNew LV
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < EvSub: case Sub.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G' G'1 LV EE1 O1 O2
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
Sub1 : replaceScopes L LV G' G'1
Sub2 : flipOnto (consVal X HoldL) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 O1
EvSub1 : <evalStmt {P}> FE EE1 (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) O2
EvSub2 : O1 ++ O2 = []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < case EvSub2.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G' G'1 LV EE1
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
Sub1 : replaceScopes L LV G' G'1
Sub2 : flipOnto (consVal X HoldL) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < EvLoop1: assert <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 [].

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G' G'1 LV EE1
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
Sub1 : replaceScopes L LV G' G'1
Sub2 : flipOnto (consVal X HoldL) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
============================
 exists G' LV,
   (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
   replaceScopes L LV G G') /\
   flipOnto HoldL (consVal X TlNew) LV
 < exists G'1,
   LV.

Subgoal 2:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G' G'1 LV EE1
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
Sub1 : replaceScopes L LV G' G'1
Sub2 : flipOnto (consVal X HoldL) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
============================
 (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) [] /\
 replaceScopes L LV G G'1) /\
 flipOnto HoldL (consVal X TlNew) LV
 < split.

Subgoal 2.8:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G' G'1 LV EE1
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
Sub1 : replaceScopes L LV G' G'1
Sub2 : flipOnto (consVal X HoldL) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
============================
 <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
 < search.

Subgoal 2.9:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G' G'1 LV EE1
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
Sub1 : replaceScopes L LV G' G'1
Sub2 : flipOnto (consVal X HoldL) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
============================
 replaceScopes L LV G G'1
 < apply replaceScopes_twice to EvBodyC1 Sub1.

Subgoal 2.9:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G' G'1 LV EE1
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
Sub1 : replaceScopes L LV G' G'1
Sub2 : flipOnto (consVal X HoldL) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
H8 : replaceScopes L LV G G'1
============================
 replaceScopes L LV G G'1
 < search.

Subgoal 2.10:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G' G'1 LV EE1
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
Sub1 : replaceScopes L LV G' G'1
Sub2 : flipOnto (consVal X HoldL) TlNew LV
EvSub : <evalStmt {P}> FE ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
============================
 flipOnto HoldL (consVal X TlNew) LV
 < case Sub2.

Subgoal 2.10:

Variables: I V Hold HoldL SaveI SaveE G FE L I1 TlNew X Tl G' G'1 LV EE1
IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L,
       updateListIndex OldL I V NewL * -> (Hold = SaveI -> false) -> (Hold = L ->
       false) -> (SaveI = SaveE -> false) -> (SaveI = L -> false) -> (Hold = SaveE ->
       false) -> (SaveE = L -> 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) ->
       lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) OldL ->
       exists G' LV,
         (<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') [] /\
         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
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
LS : lookupScopes L ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (consVal X Tl)
ULI : I - 1 = I1
ULI1 : updateListIndex Tl I1 V TlNew *
GEqI1 : I1 >= 0
EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
EvBodyC1 : replaceScopes L Tl G G'
EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
ListyH' : listy (consVal X HoldL)
IsL1 : is_string L
Is1 : is_list (is_list (is_pair is_string is_value)) G
Is : is_string Hold
Is3 : is_value HoldL
Is2 : is_string SaveI
Is6 : is_list (is_pair is_string is_value) []
Is4 : is_string SaveE
Is7 : is_value V
H1 : is_value X
H2 : is_value Tl
H3 : is_integer I
H4 : is_integer I1
EvBody' : evalStmt FE ([]::([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L))))) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) []
H5 : is_list (is_pair is_string is_value) []
H6 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
IsG'+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')
H7 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl
Sub1 : replaceScopes L LV G' G'1
EvSub : <evalStmt {P}> FE ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
EvSub1 : <evalStmt {P}> FE EE1 (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G'1) []
EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, intVal I), (SaveE, V)]::G) (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) EE1 []
H8 : flipOnto HoldL (consVal X TlNew) LV
============================
 flipOnto HoldL (consVal X TlNew) LV
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_evalStmt_exists.

Subgoal 1:

Variables: Names FE EE EE' O 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
============================
 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < Is: case IsS.

Subgoal 1:

Variables: Names FE EE EE' O 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
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
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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < Ev: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < assert SaveE = L -> false.

Subgoal 1.1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
============================
 SaveE = L -> false
 < intros E.

Subgoal 1.1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
E : SaveE = L
============================
 false
 < case E.

Subgoal 1.1:

Variables: Names FE EE EE' O Hold L SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name L) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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) L
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
============================
 false
 < apply fresh_name_not_mem to Pr3 _.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < assert SaveI = L -> false.

Subgoal 1.2:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
============================
 SaveI = L -> false
 < intros E.

Subgoal 1.2:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 L SaveE E I LV N O2 V O3 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 (greater (name L) (num 0)) (seq (assign L (minus (name L) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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) L
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < assert Hold = L -> false.

Subgoal 1.3:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign L (cons (head (name L)) (name L))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name L))) (seq (assign L (cons (head (name L)) (name L))) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < assert Hold = SaveE -> false.

Subgoal 1.4:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
============================
 Hold = SaveE -> false
 < intros E.

Subgoal 1.4:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
E : Hold = SaveE
============================
 false
 < case E.

Subgoal 1.4:

Variables: Names FE EE EE' O L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 1.4:

Variables: Names FE EE EE' O L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
AppE : "E" ++ S1 = SaveE
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 1.4.1:

Variables: Names FE EE EE' O L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
AppE : "E" ++ S1 = SaveE
============================
 is_string "Hold"
 < search 6.

Subgoal 1.4:

Variables: Names FE EE EE' O L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
AppE : "E" ++ S1 = SaveE
AppH : "Hold" ++ S2 = SaveE
============================
 false
 < case AppE.

Subgoal 1.4:

Variables: Names FE EE EE' O L SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign ("E"::L3) (cons (head (name L)) (name ("E"::L3)))) (assign L (tail (name L)))))) (seq (assign L (cons (name ("E"::L3)) (tail (name L)))) (while (not (null (name ("E"::L3)))) (seq (assign L (cons (head (name ("E"::L3))) (name L))) (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)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : "E"::L3 = L -> false
H2 : SaveI = L -> false
H3 : "E"::L3 = L -> false
AppH : "Hold" ++ S2 = "E"::L3
H4 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < assert Hold = SaveI -> false.

Subgoal 1.5:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
============================
 Hold = SaveI -> false
 < intros E.

Subgoal 1.5:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
E : Hold = SaveI
============================
 false
 < case E.

Subgoal 1.5:

Variables: Names FE EE EE' O L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : SaveI = SaveE -> false
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 1.5:

Variables: Names FE EE EE' O L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 1.5.1:

Variables: Names FE EE EE' O L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
============================
 is_string "Hold"
 < search 6.

Subgoal 1.5:

Variables: Names FE EE EE' O L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
AppH : "Hold" ++ S2 = SaveI
============================
 false
 < case AppI.

Subgoal 1.5:

Variables: Names FE EE EE' O L SaveE E I LV N O2 V O3 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 (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (assign ("I"::L3) (cons (head (name L)) (name ("I"::L3)))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name ("I"::L3)))) (seq (assign L (cons (head (name ("I"::L3))) (name L))) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : "I"::L3 = L -> false
H3 : "I"::L3 = L -> false
H4 : "I"::L3 = SaveE -> false
AppH : "Hold" ++ S2 = "I"::L3
H5 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < NEqIE: assert SaveI = SaveE -> false.

Subgoal 1.6:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
============================
 SaveI = SaveE -> false
 < intros E.

Subgoal 1.6:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
E : SaveI = SaveE
============================
 false
 < case E.

Subgoal 1.6:

Variables: Names FE EE EE' O Hold L SaveE E I LV N O2 V O3 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 (greater (name SaveE) (num 0)) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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) SaveE
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveE = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveE -> false
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 1.6:

Variables: Names FE EE EE' O Hold L SaveE E I LV N O2 V O3 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 (greater (name SaveE) (num 0)) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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) SaveE
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveE = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveE -> false
AppI : "I" ++ S1 = SaveE
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 1.6:

Variables: Names FE EE EE' O Hold L SaveE E I LV N O2 V O3 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 (greater (name SaveE) (num 0)) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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) SaveE
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveE = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveE -> false
AppI : "I" ++ S1 = SaveE
AppE : "E" ++ S2 = SaveE
============================
 false
 < case AppI.

Subgoal 1.6:

Variables: Names FE EE EE' O Hold L E I LV N O2 V O3 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 (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name ("I"::L3)) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) ("I"::L3)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : "I"::L3 = L -> false
H2 : "I"::L3 = L -> false
H3 : Hold = L -> false
H4 : Hold = "I"::L3 -> false
H5 : Hold = "I"::L3 -> false
AppE : "E" ++ S2 = "I"::L3
H6 : [] ++ S1 = L3
============================
 false
 < case AppE.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < EvI: assert evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2.

Subgoal 1.7:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
============================
 evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
 < V: apply vars_exist to Is1.

Subgoal 1.7:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
V : vars I V1
============================
 evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
 < apply evalExpr_rel_exists to _ _ _ _ Ev1 V _ with
     EE_A = []::EE.

Subgoal 1.7:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
V : vars I V1
H6 : evalExpr FE ([]::EE) I (intVal N) O2
============================
 evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
 < search.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < apply fresh_name_is to _ Pr1.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < EvE: assert evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3.

Subgoal 1.8:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
============================
 evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
 < V: apply vars_exist to Is2.

Subgoal 1.8:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
============================
 evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
 < apply evalExpr_rel_exists to _ _ _ _ Ev2 V _ with
     EE_A = [(SaveI, intVal N)]::EE.

Subgoal 1.8.1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
============================
 forall X V2,
   mem X V1 -> lookupScopes X EE V2 -> lookupScopes X ([(SaveI, intVal N)]::EE) V2
 < intros M L.

Subgoal 1.8.1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 V1 X 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
============================
 lookupScopes X ([(SaveI, intVal N)]::EE) V2
 < MemN: apply lookupScopes_names to L Names.

Subgoal 1.8.1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 V1 X 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
============================
 lookupScopes X ([(SaveI, intVal N)]::EE) V2
 < assert SaveI = X -> false.

Subgoal 1.8.1.1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 V1 X 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
============================
 SaveI = X -> false
 < intros E.

Subgoal 1.8.1.1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 V1 X 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
E : SaveI = X
============================
 false
 < case E.

Subgoal 1.8.1.1:

Variables: Names FE EE EE' O Hold L SaveE E I LV N O2 V O3 LV2 V1 X V2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy X I) (seq (declare intTy SaveE E) (seq (assign X (name X)) (seq (declare intTy Hold (nil intTy)) (seq (while (greater (name X) (num 0)) (seq (assign X (minus (name X) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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) X
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : X = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = X -> false
NEqIE : X = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy X I) ([(X, intVal N)]::EE) O2
H6 : is_string X
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
============================
 false
 < apply fresh_name_not_mem to Pr1 _.

Subgoal 1.8.1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 V1 X 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
H8 : SaveI = X -> false
============================
 lookupScopes X ([(SaveI, intVal N)]::EE) V2
 < search.

Subgoal 1.8:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
H8 : evalExpr FE ([(SaveI, intVal N)]::EE) E V O3
============================
 evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
 < search.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < apply fresh_name_is to _ Pr3.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < apply evalExpr_isValue to _ _ _ Ev2.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < EvAI: assert evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) [].

Subgoal 1.9:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
============================
 evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
 < assert SaveE = SaveI -> false.

Subgoal 1.9.1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
============================
 SaveE = SaveI -> false
 < intros E.

Subgoal 1.9.1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
E : SaveE = SaveI
============================
 false
 < case E.

Subgoal 1.9.1:

Variables: Names FE EE EE' O Hold L SaveI E I LV N O2 V O3 LV2
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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveI) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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) SaveI
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveI = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveI -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveI -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveI E) ([(SaveI, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveI
H9 : is_value V
============================
 false
 < backchain NEqIE.

Subgoal 1.9:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
H10 : SaveE = SaveI -> false
============================
 evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
 < search.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < EvH: assert evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (looseEval:list:nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) [].

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < IsSaveI: apply fresh_name_is to _ Pr1.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < IsHold: apply fresh_name_is to _ Pr2.

Subgoal 1.10:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
============================
 is_string "Hold"
 < search 6.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < GEq: apply updateListIndex_pos to Ev3.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < IsN: apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < Main: apply proj_listUpdate_eval to _ _ _ _ _ _ _ _ _ _ _ _ with
           OldL = LV
           I = N
           V = V
           NewL = LV2
           Hold = Hold HoldL = nilVal SaveI = SaveI SaveE = SaveE G = EE L = L.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < apply drop_proj_rel_evalStmt to Main.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE'' O
 < exists G'.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) G' O
 < IsO3: apply evalExpr_isOutput to _ _ _ Ev2.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) G' O
 < apply append_nil_output to IsO3.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H11 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) G' O
 < search 20.

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
 < 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
 < Ev: case Ev.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV 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 O2
Ev1 : iterateList FE EE 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
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV 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 O2
Ev1 : iterateList FE EE 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
 < apply iterateList_to_while to _ _ _ _ _ Ev1 Names Pr1.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 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 O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
H5 : evalStmt FE ([(SaveL, LV)]::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 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
 < V: apply vars_exist to _ with
        E = L.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 V' 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 O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
H5 : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
============================
 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
 < Ev': apply evalExpr_rel_exists to _ _ _ _ Ev V _ with
          EE_A = []::EE.

Subgoal 2:

Variables: Names FE EE EE' O Body SaveL X L LV O2 O3 V' 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 O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
H4 : is_value LV
H5 : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
Ev' : evalExpr FE ([]::EE) L LV 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
 < search.

Proof completed.
 < Prove_Constraint looseEval:host:proj_evalStmt_rel.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
============================
 scopes_same EE' EE_P
 < Is: case IsS.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev : evalStmt FE EE (listUpdate L I E) EE' O
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
============================
 scopes_same EE' EE_P
 < Ev: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
============================
 scopes_same EE' EE_P
 < assert SaveE = L -> false.

Subgoal 1.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
============================
 SaveE = L -> false
 < intros E.

Subgoal 1.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
E : SaveE = L
============================
 false
 < case E.

Subgoal 1.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name L) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name L) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) L
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
============================
 false
 < apply fresh_name_not_mem to Pr3 _.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
============================
 scopes_same EE' EE_P
 < assert SaveI = L -> false.

Subgoal 1.2:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
============================
 SaveI = L -> false
 < intros E.

Subgoal 1.2:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
E : SaveI = L
============================
 false
 < case E.

Subgoal 1.2:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE E I LV N O2 V O3 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 (greater (name L) (num 0)) (seq (assign L (minus (name L) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name L) (num 0)) (seq (assign L (minus (name L) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) L
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
============================
 scopes_same EE' EE_P
 < assert Hold = L -> false.

Subgoal 1.3:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 EE_P O_P L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign L (cons (head (name L)) (name L))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name L))) (seq (assign L (cons (head (name L)) (name L))) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign L (cons (head (name L)) (name L))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name L))) (seq (assign L (cons (head (name L)) (name L))) (assign L (tail (name L)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) L
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE 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 EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
============================
 scopes_same EE' EE_P
 < assert Hold = SaveE -> false.

Subgoal 1.4:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
============================
 Hold = SaveE -> false
 < intros E.

Subgoal 1.4:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
E : Hold = SaveE
============================
 false
 < case E.

Subgoal 1.4:

Variables: Names FE EE EE' O EE_P O_P L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (assign SaveE (tail (name SaveE)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveE
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 1.4:

Variables: Names FE EE EE' O EE_P O_P L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (assign SaveE (tail (name SaveE)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveE
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
AppE : "E" ++ S1 = SaveE
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 1.4.1:

Variables: Names FE EE EE' O EE_P O_P L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (assign SaveE (tail (name SaveE)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveE
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
AppE : "E" ++ S1 = SaveE
============================
 is_string "Hold"
 < search 6.

Subgoal 1.4:

Variables: Names FE EE EE' O EE_P O_P L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveE (cons (head (name L)) (name SaveE))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveE))) (seq (assign L (cons (head (name SaveE)) (name L))) (assign SaveE (tail (name SaveE)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveE
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveE = L -> false
AppE : "E" ++ S1 = SaveE
AppH : "Hold" ++ S2 = SaveE
============================
 false
 < case AppE.

Subgoal 1.4:

Variables: Names FE EE EE' O EE_P O_P L SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign ("E"::L3) (cons (head (name L)) (name ("E"::L3)))) (assign L (tail (name L)))))) (seq (assign L (cons (name ("E"::L3)) (tail (name L)))) (while (not (null (name ("E"::L3)))) (seq (assign L (cons (head (name ("E"::L3))) (name L))) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign ("E"::L3) (cons (head (name L)) (name ("E"::L3)))) (assign L (tail (name L)))))) (seq (assign L (cons (name ("E"::L3)) (tail (name L)))) (while (not (null (name ("E"::L3)))) (seq (assign L (cons (head (name ("E"::L3))) (name L))) (assign ("E"::L3) (tail (name ("E"::L3))))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) ("E"::L3)
Pr3 : fresh_name "E" (L::Names) ("E"::L3)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : "E"::L3 = L -> false
H2 : SaveI = L -> false
H3 : "E"::L3 = L -> false
AppH : "Hold" ++ S2 = "E"::L3
H4 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
============================
 scopes_same EE' EE_P
 < assert Hold = SaveI -> false.

Subgoal 1.5:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
============================
 Hold = SaveI -> false
 < intros E.

Subgoal 1.5:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
E : Hold = SaveI
============================
 false
 < case E.

Subgoal 1.5:

Variables: Names FE EE EE' O EE_P O_P L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (assign SaveI (tail (name SaveI)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveI
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : SaveI = SaveE -> false
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 1.5:

Variables: Names FE EE EE' O EE_P O_P L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (assign SaveI (tail (name SaveI)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveI
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
============================
 false
 < AppH: apply fresh_name_start to _ Pr2.

Subgoal 1.5.1:

Variables: Names FE EE EE' O EE_P O_P L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (assign SaveI (tail (name SaveI)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveI
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
============================
 is_string "Hold"
 < search 6.

Subgoal 1.5:

Variables: Names FE EE EE' O EE_P O_P L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign SaveI (cons (head (name L)) (name SaveI))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name SaveI))) (seq (assign L (cons (head (name SaveI)) (name L))) (assign SaveI (tail (name SaveI)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) SaveI
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : SaveI = L -> false
H4 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
AppH : "Hold" ++ S2 = SaveI
============================
 false
 < case AppI.

Subgoal 1.5:

Variables: Names FE EE EE' O EE_P O_P L SaveE E I LV N O2 V O3 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 (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (assign ("I"::L3) (cons (head (name L)) (name ("I"::L3)))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name ("I"::L3)))) (seq (assign L (cons (head (name ("I"::L3))) (name L))) (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
Ev_P : 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 (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (assign ("I"::L3) (cons (head (name L)) (name ("I"::L3)))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name ("I"::L3)))) (seq (assign L (cons (head (name ("I"::L3))) (name L))) (assign ("I"::L3) (tail (name ("I"::L3))))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) ("I"::L3)
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : "I"::L3 = L -> false
H3 : "I"::L3 = L -> false
H4 : "I"::L3 = SaveE -> false
AppH : "Hold" ++ S2 = "I"::L3
H5 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
============================
 scopes_same EE' EE_P
 < NEqIE: assert SaveI = SaveE -> false.

Subgoal 1.6:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
============================
 SaveI = SaveE -> false
 < intros E.

Subgoal 1.6:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
E : SaveI = SaveE
============================
 false
 < case E.

Subgoal 1.6:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE E I LV N O2 V O3 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 (greater (name SaveE) (num 0)) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveE) (num 0)) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveE
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveE = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveE -> false
============================
 false
 < AppI: apply fresh_name_start to _ Pr1.

Subgoal 1.6:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE E I LV N O2 V O3 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 (greater (name SaveE) (num 0)) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveE) (num 0)) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveE
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveE = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveE -> false
AppI : "I" ++ S1 = SaveE
============================
 false
 < AppE: apply fresh_name_start to _ Pr3.

Subgoal 1.6:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE E I LV N O2 V O3 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 (greater (name SaveE) (num 0)) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveE) (num 0)) (seq (assign SaveE (minus (name SaveE) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveE
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveE = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveE -> false
AppI : "I" ++ S1 = SaveE
AppE : "E" ++ S2 = SaveE
============================
 false
 < case AppI.

Subgoal 1.6:

Variables: Names FE EE EE' O EE_P O_P Hold L E I LV N O2 V O3 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 (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name ("I"::L3)) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name ("I"::L3)) (num 0)) (seq (assign ("I"::L3) (minus (name ("I"::L3)) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name ("I"::L3)) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) ("I"::L3)
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) ("I"::L3)
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : "I"::L3 = L -> false
H2 : "I"::L3 = L -> false
H3 : Hold = L -> false
H4 : Hold = "I"::L3 -> false
H5 : Hold = "I"::L3 -> false
AppE : "E" ++ S2 = "I"::L3
H6 : [] ++ S1 = L3
============================
 false
 < case AppE.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
============================
 scopes_same EE' EE_P
 < EvI: assert evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2.

Subgoal 1.7:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
============================
 evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
 < V: apply vars_exist to Is1.

Subgoal 1.7:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
V : vars I V1
============================
 evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
 < apply evalExpr_rel_exists to _ _ _ _ Ev1 V _ with
     EE_A = []::EE.

Subgoal 1.7:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
V : vars I V1
H6 : evalExpr FE ([]::EE) I (intVal N) O2
============================
 evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
 < search.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
============================
 scopes_same EE' EE_P
 < apply fresh_name_is to _ Pr1.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
============================
 scopes_same EE' EE_P
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
============================
 scopes_same EE' EE_P
 < EvE: assert evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3.

Subgoal 1.8:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
============================
 evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
 < V: apply vars_exist to Is2.

Subgoal 1.8:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
============================
 evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
 < apply evalExpr_rel_exists to _ _ _ _ Ev2 V _ with
     EE_A = [(SaveI, intVal N)]::EE.

Subgoal 1.8.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
============================
 forall X V2,
   mem X V1 -> lookupScopes X EE V2 -> lookupScopes X ([(SaveI, intVal N)]::EE) V2
 < intros M L.

Subgoal 1.8.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 V1 X 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
============================
 lookupScopes X ([(SaveI, intVal N)]::EE) V2
 < MemN: apply lookupScopes_names to L Names.

Subgoal 1.8.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 V1 X 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
============================
 lookupScopes X ([(SaveI, intVal N)]::EE) V2
 < assert SaveI = X -> false.

Subgoal 1.8.1.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 V1 X 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
============================
 SaveI = X -> false
 < intros E.

Subgoal 1.8.1.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 V1 X 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
E : SaveI = X
============================
 false
 < case E.

Subgoal 1.8.1.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE E I LV N O2 V O3 LV2 V1 X V2
Pr : Names |{stmt}- listUpdate L I E ~~> scopeStmt (seq (declare intTy X I) (seq (declare intTy SaveE E) (seq (assign X (name X)) (seq (declare intTy Hold (nil intTy)) (seq (while (greater (name X) (num 0)) (seq (assign X (minus (name X) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : evalStmt FE EE (scopeStmt (seq (declare intTy X I) (seq (declare intTy SaveE E) (seq (assign X (name X)) (seq (declare intTy Hold (nil intTy)) (seq (while (greater (name X) (num 0)) (seq (assign X (minus (name X) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) X
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : X = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = X -> false
NEqIE : X = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy X I) ([(X, intVal N)]::EE) O2
H6 : is_string X
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
============================
 false
 < apply fresh_name_not_mem to Pr1 _.

Subgoal 1.8.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 V1 X 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
H8 : SaveI = X -> false
============================
 lookupScopes X ([(SaveI, intVal N)]::EE) V2
 < search.

Subgoal 1.8:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
V : vars E V1
H8 : evalExpr FE ([(SaveI, intVal N)]::EE) E V O3
============================
 evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
 < search.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
============================
 scopes_same EE' EE_P
 < apply fresh_name_is to _ Pr3.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
============================
 scopes_same EE' EE_P
 < apply evalExpr_isValue to _ _ _ Ev2.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
============================
 scopes_same EE' EE_P
 < EvAI: assert evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) [].

Subgoal 1.9:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
============================
 evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
 < assert SaveE = SaveI -> false.

Subgoal 1.9.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
============================
 SaveE = SaveI -> false
 < intros E.

Subgoal 1.9.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
E : SaveE = SaveI
============================
 false
 < case E.

Subgoal 1.9.1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveI E I LV N O2 V O3 LV2
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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveI) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveI E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveI) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveI
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveI = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveI -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveI -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveI E) ([(SaveI, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveI
H9 : is_value V
============================
 false
 < backchain NEqIE.

Subgoal 1.9:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
H10 : SaveE = SaveI -> false
============================
 evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
 < search.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
============================
 scopes_same EE' EE_P
 < EvH: assert evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (looseEval:list:nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) [].

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
============================
 scopes_same EE' EE_P
 < IsSaveI: apply fresh_name_is to _ Pr1.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
============================
 scopes_same EE' EE_P
 < IsHold: apply fresh_name_is to _ Pr2.

Subgoal 1.10:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
============================
 is_string "Hold"
 < search 6.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
============================
 scopes_same EE' EE_P
 < GEq: apply updateListIndex_pos to Ev3.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
============================
 scopes_same EE' EE_P
 < IsN: apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
============================
 scopes_same EE' EE_P
 < Main: apply proj_listUpdate_eval to _ _ _ _ _ _ _ _ _ _ _ _ with
           OldL = LV
           I = N
           V = V
           NewL = LV2
           Hold = Hold HoldL = nilVal SaveI = SaveI SaveE = SaveE G = EE L = L.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
============================
 scopes_same EE' EE_P
 < apply drop_proj_rel_evalStmt to Main.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
============================
 scopes_same EE' EE_P
 < IsO3: apply evalExpr_isOutput to _ _ _ Ev2.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
============================
 scopes_same EE' EE_P
 < apply append_nil_output to IsO3.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H11 : O3 ++ [] = O3
============================
 scopes_same EE' EE_P
 < EvW: assert evalStmt FE EE (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (looseEval:list:nil intTy)) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) G' O.

Subgoal 1.11:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H11 : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) G' O
 < search 20.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) EE_P O_P
Pr1 : fresh_name "I" (L::Names) SaveI
Pr2 : fresh_name "Hold" (L::Names) Hold
Pr3 : fresh_name "E" (L::Names) SaveE
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H11 : O3 ++ [] = O3
EvW : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) G' O
============================
 scopes_same EE' EE_P
 < Ev_P: case Ev_P.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' LV1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H11 : O3 ++ [] = O3
EvW : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))) G' O
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope::EE_P) O_P
============================
 scopes_same EE' EE_P
 < EvW: case EvW.

Subgoal 1:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' LV1 Scope 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H11 : O3 ++ [] = O3
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope::EE_P) O_P
EvW : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::G') O
============================
 scopes_same EE' EE_P
 < apply evalStmt_unique to _ _ _ Ev_P EvW.

Subgoal 1.12:

Variables: Names FE EE EE' O EE_P O_P Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' LV1 Scope 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H11 : O3 ++ [] = O3
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope::EE_P) O_P
EvW : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::G') O
============================
 is_stmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold)))))))))))
 < search 20.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV2 G' LV1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV2
Ev4 : replaceScopes L LV2 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H11 : O3 ++ [] = O3
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::G') O
EvW : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::G') O
============================
 scopes_same EE' G'
 < case Main2.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 G' LV1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV1
Ev4 : replaceScopes L LV1 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
IsO3 : is_list is_value O3
H11 : O3 ++ [] = O3
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::G') O
EvW : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::G') O
============================
 scopes_same EE' G'
 < apply replaceScopes_unique to Main1 Ev4.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV1
Ev4 : replaceScopes L LV1 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::EE') []
Main1 : replaceScopes L LV1 EE EE'
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::EE') []
IsO3 : is_list is_value O3
H11 : O3 ++ [] = O3
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::EE') O
EvW : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::EE') O
============================
 scopes_same EE' EE'
 < apply lookupScopes_is to _ Ev.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV1
Ev4 : replaceScopes L LV1 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::EE') []
Main1 : replaceScopes L LV1 EE EE'
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::EE') []
IsO3 : is_list is_value O3
H11 : O3 ++ [] = O3
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::EE') O
EvW : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::EE') O
H12 : is_value LV
H13 : is_string L
============================
 scopes_same EE' EE'
 < apply updateListIndex_is to _ _ Ev3.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV1
Ev4 : replaceScopes L LV1 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::EE') []
Main1 : replaceScopes L LV1 EE EE'
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::EE') []
IsO3 : is_list is_value O3
H11 : O3 ++ [] = O3
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::EE') O
EvW : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::EE') O
H12 : is_value LV
H13 : is_string L
H14 : is_value LV1
============================
 scopes_same EE' EE'
 < apply replaceScopes_is to _ _ Main1.

Subgoal 1:

Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV N O2 V O3 LV1 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (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
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
Ev : lookupScopes L EE LV
Ev1 : evalExpr FE EE I (intVal N) O2
Ev2 : evalExpr FE EE E V O3
Ev3 : updateListIndex LV N V LV1
Ev4 : replaceScopes L LV1 EE EE'
Ev5 : O2 ++ O3 = O
H1 : SaveE = L -> false
H2 : SaveI = L -> false
H3 : Hold = L -> false
H4 : Hold = SaveE -> false
H5 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI : evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N)]::EE) O2
H6 : is_string SaveI
H7 : is_value (intVal N)
EvE : evalStmt FE ([(SaveI, intVal N)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N)]::EE) O3
H8 : is_string SaveE
H9 : is_value V
EvAI : evalStmt FE ([(SaveE, V), (SaveI, intVal N)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N), (SaveE, V)]::EE) []
EvH : evalStmt FE ([(SaveI, intVal N), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) []
IsSaveI : is_string SaveI
IsHold : is_string Hold
GEq : N >= 0
IsN : is_value (intVal N)
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::EE') []
Main1 : replaceScopes L LV1 EE EE'
H10 : evalStmt FE ([(Hold, nilVal), (SaveI, intVal N), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::EE') []
IsO3 : is_list is_value O3
H11 : O3 ++ [] = O3
Ev_P : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::EE') O
EvW : 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 (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))))))) (Scope1::EE') O
H12 : is_value LV
H13 : is_string L
H14 : is_value LV1
H15 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 scopes_same EE' EE'
 < backchain scopes_same_reflexive.

Subgoal 2:

Variables: Names FE EE EE' O EE_P O_P 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
Ev_P : 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_P O_P
Pr1 : fresh_name "L" (X::Names) SaveL
============================
 scopes_same EE' EE_P
 < Is: case IsS.

Subgoal 2:

Variables: Names FE EE EE' O EE_P O_P 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
Ev_P : 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_P O_P
Pr1 : fresh_name "L" (X::Names) SaveL
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
============================
 scopes_same EE' EE_P
 < Ev: case Ev.

Subgoal 2:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV 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
Ev_P : 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_P O_P
Pr1 : fresh_name "L" (X::Names) SaveL
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
============================
 scopes_same EE' EE_P
 < Ev_P: case Ev_P.

Subgoal 2:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 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
Pr1 : fresh_name "L" (X::Names) SaveL
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : 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_P) O_P
============================
 scopes_same EE' EE_P
 < Ev_P: case Ev_P.

Subgoal 2:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 Scope EE3 O1 O4
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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : evalStmt FE ([]::EE) (declare intTy SaveL L) EE3 O1
Ev_P1 : evalStmt FE EE3 (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
============================
 scopes_same EE' EE_P
 < apply evalExpr_isValue to _ _ _ Ev.

Subgoal 2:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 Scope EE3 O1 O4
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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : evalStmt FE ([]::EE) (declare intTy SaveL L) EE3 O1
Ev_P1 : evalStmt FE EE3 (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
H1 : is_value LV
============================
 scopes_same EE' EE_P
 < EvW: apply iterateList_to_while to _ _ _ _ _ Ev1 Names Pr1.

Subgoal 2:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 Scope EE3 O1 O4 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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : evalStmt FE ([]::EE) (declare intTy SaveL L) EE3 O1
Ev_P1 : evalStmt FE EE3 (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
H1 : is_value LV
EvW : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 scopes_same EE' EE_P
 < Eq: assert EE3 = [(SaveL, LV)]::EE.

Subgoal 2.1:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 Scope EE3 O1 O4 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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : evalStmt FE ([]::EE) (declare intTy SaveL L) EE3 O1
Ev_P1 : evalStmt FE EE3 (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
H1 : is_value LV
EvW : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 EE3 = [(SaveL, LV)]::EE
 < V: apply vars_exist to Is1.

Subgoal 2.1:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 Scope EE3 O1 O4 V' 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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : evalStmt FE ([]::EE) (declare intTy SaveL L) EE3 O1
Ev_P1 : evalStmt FE EE3 (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
H1 : is_value LV
EvW : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
============================
 EE3 = [(SaveL, LV)]::EE
 < Ev': case Ev_P.

Subgoal 2.1:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 Scope O1 O4 V' V V1
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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P1 : evalStmt FE ([(SaveL, V1)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
H1 : is_value LV
EvW : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
Ev' : evalExpr FE ([]::EE) L V1 O1
============================
 [(SaveL, V1)]::EE = [(SaveL, LV)]::EE
 < E: apply evalExpr_rel_exists to _ _ _ _ Ev V _ with
        EE_A = []::EE.

Subgoal 2.1:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 Scope O1 O4 V' V V1
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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P1 : evalStmt FE ([(SaveL, V1)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
H1 : is_value LV
EvW : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
Ev' : evalExpr FE ([]::EE) L V1 O1
E : evalExpr FE ([]::EE) L LV O2
============================
 [(SaveL, V1)]::EE = [(SaveL, LV)]::EE
 < apply evalExpr_unique to _ _ _ E Ev'.

Subgoal 2.1:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L O3 Scope O1 O4 V' V V1
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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L V1 O1
Ev1 : iterateList FE EE V1 X Body EE' O3
Ev2 : O1 ++ O3 = O
Ev_P1 : evalStmt FE ([(SaveL, V1)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
H1 : is_value V1
EvW : evalStmt FE ([(SaveL, V1)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
Ev' : evalExpr FE ([]::EE) L V1 O1
E : evalExpr FE ([]::EE) L V1 O1
============================
 [(SaveL, V1)]::EE = [(SaveL, V1)]::EE
 < search.

Subgoal 2:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 Scope EE3 O1 O4 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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : evalStmt FE ([]::EE) (declare intTy SaveL L) EE3 O1
Ev_P1 : evalStmt FE EE3 (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
H1 : is_value LV
EvW : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Eq : EE3 = [(SaveL, LV)]::EE
============================
 scopes_same EE' EE_P
 < case Eq.

Subgoal 2:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 Scope O1 O4 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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : evalStmt FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE) O1
Ev_P1 : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
H1 : is_value LV
EvW : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
============================
 scopes_same EE' EE_P
 < apply fresh_name_is to _ Pr1.

Subgoal 2:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 Scope O1 O4 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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : evalStmt FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE) O1
Ev_P1 : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
H1 : is_value LV
EvW : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
H2 : is_string SaveL
============================
 scopes_same EE' EE_P
 < apply evalStmt_unique to _ _ _ Ev_P1 EvW.

Subgoal 2.2:

Variables: Names FE EE EE' O EE_P O_P Body SaveL X L LV O2 O3 Scope O1 O4 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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : evalStmt FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE) O1
Ev_P1 : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) (Scope::EE_P) O4
Ev_P2 : O1 ++ O4 = O_P
H1 : is_value LV
EvW : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
H2 : 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:

Variables: Names FE EE EE' O O_P Body SaveL X L LV O2 O3 O1 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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : evalStmt FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE) O1
Ev_P1 : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Ev_P2 : O1 ++ O3 = O_P
H1 : is_value LV
EvW : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
H2 : is_string SaveL
============================
 scopes_same EE' EE'
 < apply iterateList_isCtx to _ _ _ _ _ Ev1.

Subgoal 2:

Variables: Names FE EE EE' O O_P Body SaveL X L LV O2 O3 O1 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
Is : is_string X
Is1 : is_expr L
Is2 : is_stmt Body
Ev : evalExpr FE EE L LV O2
Ev1 : iterateList FE EE LV X Body EE' O3
Ev2 : O2 ++ O3 = O
Ev_P : evalStmt FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE) O1
Ev_P1 : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
Ev_P2 : O1 ++ O3 = O_P
H1 : is_value LV
EvW : evalStmt FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
H2 : is_string SaveL
H3 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 scopes_same EE' EE'
 < backchain scopes_same_reflexive.

Proof completed.
 < Prove_Ext_Ind looseEval:host:evalExpr,
   looseEval:host:evalArgs,
   looseEval:host:evalRecFields,
   looseEval: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.26:

Variables: FE EE Ty
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) nilVal [] 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) nilVal []
 < search.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < case IsE.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < apply ext_size_is_int_evalExpr to R3.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < apply ext_size_is_int_evalExpr to R4.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < apply plus_integer_is_integer to _ _ R2.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < L: apply lt_plus_one to R1 _.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < apply ext_size_pos_evalExpr to R3.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < apply ext_size_pos_evalExpr to R4.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < Acc: case Acc.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < RP1: assert <evalExpr {P}> FE EE E1 V1 O2.

Subgoal 1.27.1:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE E1 V1 O2
 < Or: apply lt_left to R2 _ _.

Subgoal 1.27.1:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
Or : N2 < N4 \/ N2 = N4
============================
 <evalExpr {P}> FE EE E1 V1 O2
 < L': case Or.

Subgoal 1.27.1.1:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
============================
 <evalExpr {P}> FE EE E1 V1 O2
 < L'': apply less_integer_transitive to L' L.

Subgoal 1.27.1.1:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
L'' : N2 < N
============================
 <evalExpr {P}> FE EE E1 V1 O2
 < A2: apply Acc to _ L''.

Subgoal 1.27.1.1:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 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 O2
 < apply IH to R3 A2 _ _ _.

Subgoal 1.27.1.1:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
L'' : N2 < N
A2 : acc N2 *
H8 : <evalExpr {P}> FE EE E1 V1 O2
============================
 <evalExpr {P}> FE EE E1 V1 O2
 < search.

Subgoal 1.27.1.2:

Variables: N FE EE O N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (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 O2 N4 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N4
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N4
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE E1 V1 O2
 < A2: apply Acc to _ L.

Subgoal 1.27.1.2:

Variables: N FE EE O N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (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 O2 N4 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N4
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N4
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N4 *
============================
 <evalExpr {P}> FE EE E1 V1 O2
 < apply IH to R3 A2 _ _ _.

Subgoal 1.27.1.2:

Variables: N FE EE O N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (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 O2 N4 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N4
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N4
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N4 *
H8 : <evalExpr {P}> FE EE E1 V1 O2
============================
 <evalExpr {P}> FE EE E1 V1 O2
 < search.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < RP2: assert <evalExpr {P}> FE EE E2 V2 O3.

Subgoal 1.27.2:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
============================
 <evalExpr {P}> FE EE E2 V2 O3
 < Ev1: apply drop_ext_size_evalExpr to R3.

Subgoal 1.27.2:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
Ev1 : evalExpr FE EE E1 V1 O2
============================
 <evalExpr {P}> FE EE E2 V2 O3
 < Or: apply lt_right to R2 _ _ _.

Subgoal 1.27.2:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
Ev1 : evalExpr FE EE E1 V1 O2
Or : N3 < N4 \/ N3 = N4
============================
 <evalExpr {P}> FE EE E2 V2 O3
 < L': case Or.

Subgoal 1.27.2.1:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
Ev1 : evalExpr FE EE E1 V1 O2
L' : N3 < N4
============================
 <evalExpr {P}> FE EE E2 V2 O3
 < L'': apply less_integer_transitive to L' L.

Subgoal 1.27.2.1:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
Ev1 : evalExpr FE EE E1 V1 O2
L' : N3 < N4
L'' : N3 < N
============================
 <evalExpr {P}> FE EE E2 V2 O3
 < A3: apply Acc to _ L''.

Subgoal 1.27.2.1:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
Ev1 : evalExpr FE EE E1 V1 O2
L' : N3 < N4
L'' : N3 < N
A3 : acc N3 *
============================
 <evalExpr {P}> FE EE E2 V2 O3
 < apply IH to R4 A3 _ _ _.

Subgoal 1.27.2.1:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
Ev1 : evalExpr FE EE E1 V1 O2
L' : N3 < N4
L'' : N3 < N
A3 : acc N3 *
H8 : <evalExpr {P}> FE EE E2 V2 O3
============================
 <evalExpr {P}> FE EE E2 V2 O3
 < search.

Subgoal 1.27.2.2:

Variables: N FE EE O N2 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N4 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N4
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N4
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
Ev1 : evalExpr FE EE E1 V1 O2
============================
 <evalExpr {P}> FE EE E2 V2 O3
 < A3: apply Acc to _ L.

Subgoal 1.27.2.2:

Variables: N FE EE O N2 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N4 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N4
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N4
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
Ev1 : evalExpr FE EE E1 V1 O2
A3 : acc N4 *
============================
 <evalExpr {P}> FE EE E2 V2 O3
 < apply IH to R4 A3 _ _ _.

Subgoal 1.27.2.2:

Variables: N FE EE O N2 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N4 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N4
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N4
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
Ev1 : evalExpr FE EE E1 V1 O2
A3 : acc N4 *
H8 : <evalExpr {P}> FE EE E2 V2 O3
============================
 <evalExpr {P}> FE EE E2 V2 O3
 < search.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
RP2 : <evalExpr {P}> FE EE E2 V2 O3
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < Ev1: apply drop_ext_size_evalExpr to R3.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
RP2 : <evalExpr {P}> FE EE E2 V2 O3
Ev1 : evalExpr FE EE E1 V1 O2
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < Ev2: apply drop_ext_size_evalExpr to R4.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
RP2 : <evalExpr {P}> FE EE E2 V2 O3
Ev1 : evalExpr FE EE E1 V1 O2
Ev2 : evalExpr FE EE E2 V2 O3
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < IsV1: apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
RP2 : <evalExpr {P}> FE EE E2 V2 O3
Ev1 : evalExpr FE EE E1 V1 O2
Ev2 : evalExpr FE EE E2 V2 O3
IsV1 : is_value V1
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < IsV2: apply evalExpr_isValue to _ _ _ Ev2.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
RP2 : <evalExpr {P}> FE EE E2 V2 O3
Ev1 : evalExpr FE EE E1 V1 O2
Ev2 : evalExpr FE EE E2 V2 O3
IsV1 : is_value V1
IsV2 : is_value V2
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < Or: apply is_value_eq_or_not to IsV1 IsV2.

Subgoal 1.27:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
RP2 : <evalExpr {P}> FE EE E2 V2 O3
Ev1 : evalExpr FE EE E1 V1 O2
Ev2 : evalExpr FE EE E2 V2 O3
IsV1 : is_value V1
IsV2 : is_value V2
Or : V1 = V2 \/ (V1 = V2 -> false)
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < case Or.

Subgoal 1.27.3:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V2 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 V2 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V2 O2
RP2 : <evalExpr {P}> FE EE E2 V2 O3
Ev1 : evalExpr FE EE E1 V2 O2
Ev2 : evalExpr FE EE E2 V2 O3
IsV1 : is_value V2
IsV2 : is_value V2
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V2 V2) O
 < search.

Subgoal 1.27.4:

Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) (consVal V1 V2) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : 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 O2 N2 **
R4 : <evalExpr {ES}> FE EE E2 V2 O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE E1 V1 O2
RP2 : <evalExpr {P}> FE EE E2 V2 O3
Ev1 : evalExpr FE EE E1 V1 O2
Ev2 : evalExpr FE EE E2 V2 O3
IsV1 : is_value V1
IsV2 : is_value V2
H8 : V1 = V2 -> false
============================
 <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
 < search.

Subgoal 1.28:

Variables: N FE EE V O N2 Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (consVal V Tl) O N2 **
============================
 <evalExpr {P}> FE EE (head E1) V O
 < case IsE.

Subgoal 1.28:

Variables: N FE EE V O N2 Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal V Tl) O N2 **
H1 : is_expr E1
============================
 <evalExpr {P}> FE EE (head E1) V O
 < apply ext_size_is_int_evalExpr to R2.

Subgoal 1.28:

Variables: N FE EE V O N2 Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal V Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
============================
 <evalExpr {P}> FE EE (head E1) V O
 < L: apply lt_plus_one to R1 _.

Subgoal 1.28:

Variables: N FE EE V O N2 Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal V Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
============================
 <evalExpr {P}> FE EE (head E1) V O
 < apply ext_size_pos_evalExpr to R2.

Subgoal 1.28:

Variables: N FE EE V O N2 Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal V Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
============================
 <evalExpr {P}> FE EE (head E1) V O
 < Acc: case Acc.

Subgoal 1.28:

Variables: N FE EE V O N2 Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal V Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (head E1) V O
 < A: apply Acc to _ L.

Subgoal 1.28:

Variables: N FE EE V O N2 Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal V Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
============================
 <evalExpr {P}> FE EE (head E1) V O
 < apply IH to R2 A _ _ _.

Subgoal 1.28:

Variables: N FE EE V O N2 Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal V Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
H4 : <evalExpr {P}> FE EE E1 (consVal V Tl) O
============================
 <evalExpr {P}> FE EE (head E1) V O
 < search.

Subgoal 1.29:

Variables: N FE EE V O N2 Hd E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (consVal Hd V) O N2 **
============================
 <evalExpr {P}> FE EE (tail E1) V O
 < case IsE.

Subgoal 1.29:

Variables: N FE EE V O N2 Hd E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd V) O N2 **
H1 : is_expr E1
============================
 <evalExpr {P}> FE EE (tail E1) V O
 < apply ext_size_is_int_evalExpr to R2.

Subgoal 1.29:

Variables: N FE EE V O N2 Hd E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd V) O N2 **
H1 : is_expr E1
H2 : is_integer N2
============================
 <evalExpr {P}> FE EE (tail E1) V O
 < L: apply lt_plus_one to R1 _.

Subgoal 1.29:

Variables: N FE EE V O N2 Hd E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd V) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
============================
 <evalExpr {P}> FE EE (tail E1) V O
 < apply ext_size_pos_evalExpr to R2.

Subgoal 1.29:

Variables: N FE EE V O N2 Hd E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd V) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
============================
 <evalExpr {P}> FE EE (tail E1) V O
 < Acc: case Acc.

Subgoal 1.29:

Variables: N FE EE V O N2 Hd E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd V) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (tail E1) V O
 < A: apply Acc to _ L.

Subgoal 1.29:

Variables: N FE EE V O N2 Hd E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd V) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
============================
 <evalExpr {P}> FE EE (tail E1) V O
 < apply IH to R2 A _ _ _.

Subgoal 1.29:

Variables: N FE EE V O N2 Hd E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd V) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
H4 : <evalExpr {P}> FE EE E1 (consVal Hd V) O
============================
 <evalExpr {P}> FE EE (tail E1) V O
 < search.

Subgoal 1.30:

Variables: N FE EE O N2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) trueVal O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 nilVal O N2 **
============================
 <evalExpr {P}> FE EE (null E1) trueVal O
 < case IsE.

Subgoal 1.30:

Variables: N FE EE O N2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) trueVal O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 nilVal O N2 **
H1 : is_expr E1
============================
 <evalExpr {P}> FE EE (null E1) trueVal O
 < apply ext_size_is_int_evalExpr to R2.

Subgoal 1.30:

Variables: N FE EE O N2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) trueVal O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 nilVal O N2 **
H1 : is_expr E1
H2 : is_integer N2
============================
 <evalExpr {P}> FE EE (null E1) trueVal O
 < L: apply lt_plus_one to R1 _.

Subgoal 1.30:

Variables: N FE EE O N2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) trueVal O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 nilVal O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
============================
 <evalExpr {P}> FE EE (null E1) trueVal O
 < apply ext_size_pos_evalExpr to R2.

Subgoal 1.30:

Variables: N FE EE O N2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) trueVal O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 nilVal O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
============================
 <evalExpr {P}> FE EE (null E1) trueVal O
 < Acc: case Acc.

Subgoal 1.30:

Variables: N FE EE O N2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) trueVal O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 nilVal O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (null E1) trueVal O
 < A: apply Acc to _ L.

Subgoal 1.30:

Variables: N FE EE O N2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) trueVal O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 nilVal O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
============================
 <evalExpr {P}> FE EE (null E1) trueVal O
 < apply IH to R2 A _ _ _.

Subgoal 1.30:

Variables: N FE EE O N2 E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) trueVal O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 nilVal O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
H4 : <evalExpr {P}> FE EE E1 nilVal O
============================
 <evalExpr {P}> FE EE (null E1) trueVal O
 < search.

Subgoal 1.31:

Variables: N FE EE O N2 Hd Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) falseVal O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (consVal Hd Tl) O N2 **
============================
 <evalExpr {P}> FE EE (null E1) falseVal O
 < case IsE.

Subgoal 1.31:

Variables: N FE EE O N2 Hd Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) falseVal O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd Tl) O N2 **
H1 : is_expr E1
============================
 <evalExpr {P}> FE EE (null E1) falseVal O
 < apply ext_size_is_int_evalExpr to R2.

Subgoal 1.31:

Variables: N FE EE O N2 Hd Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) falseVal O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
============================
 <evalExpr {P}> FE EE (null E1) falseVal O
 < L: apply lt_plus_one to R1 _.

Subgoal 1.31:

Variables: N FE EE O N2 Hd Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) falseVal O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
============================
 <evalExpr {P}> FE EE (null E1) falseVal O
 < apply ext_size_pos_evalExpr to R2.

Subgoal 1.31:

Variables: N FE EE O N2 Hd Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) falseVal O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
============================
 <evalExpr {P}> FE EE (null E1) falseVal O
 < Acc: case Acc.

Subgoal 1.31:

Variables: N FE EE O N2 Hd Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) falseVal O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (null E1) falseVal O
 < A: apply Acc to _ L.

Subgoal 1.31:

Variables: N FE EE O N2 Hd Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) falseVal O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
============================
 <evalExpr {P}> FE EE (null E1) falseVal O
 < apply IH to R2 A _ _ _.

Subgoal 1.31:

Variables: N FE EE O N2 Hd Tl E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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) falseVal O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 (consVal Hd Tl) O N2 **
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
H4 : <evalExpr {P}> FE EE E1 (consVal Hd Tl) O
============================
 <evalExpr {P}> FE EE (null E1) falseVal O
 < search.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
============================
 <evalExpr {P}> FE EE (index L I) V O
 < case IsE.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) 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 O
 < apply ext_size_is_int_evalExpr to R3.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
============================
 <evalExpr {P}> FE EE (index L I) V O
 < apply ext_size_is_int_evalExpr to R4.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
============================
 <evalExpr {P}> FE EE (index L I) V O
 < apply plus_integer_is_integer to _ _ R2.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
============================
 <evalExpr {P}> FE EE (index L I) V O
 < L: apply lt_plus_one to R1 _.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
============================
 <evalExpr {P}> FE EE (index L I) V O
 < apply ext_size_pos_evalExpr to R3.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
============================
 <evalExpr {P}> FE EE (index L I) V O
 < apply ext_size_pos_evalExpr to R4.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
============================
 <evalExpr {P}> FE EE (index L I) V O
 < Acc: case Acc.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (index L I) V O
 < RP1: assert <evalExpr {P}> FE EE L LV O2.

Subgoal 1.32.1:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE L LV O2
 < Or: apply lt_left to R2 _ _.

Subgoal 1.32.1:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
Or : N2 < N4 \/ N2 = N4
============================
 <evalExpr {P}> FE EE L LV O2
 < L': case Or.

Subgoal 1.32.1.1:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
============================
 <evalExpr {P}> FE EE L LV O2
 < L'': apply less_integer_transitive to L' L.

Subgoal 1.32.1.1:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
L'' : N2 < N
============================
 <evalExpr {P}> FE EE L LV O2
 < A2: apply Acc to _ L''.

Subgoal 1.32.1.1:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
L'' : N2 < N
A2 : acc N2 *
============================
 <evalExpr {P}> FE EE L LV O2
 < apply IH to R3 A2 _ _ _.

Subgoal 1.32.1.1:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
L' : N2 < N4
L'' : N2 < N
A2 : acc N2 *
H8 : <evalExpr {P}> FE EE L LV O2
============================
 <evalExpr {P}> FE EE L LV O2
 < search.

Subgoal 1.32.1.2:

Variables: N FE EE V O N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (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 O2 N4 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N4
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N4
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE L LV O2
 < A2: apply Acc to _ L.

Subgoal 1.32.1.2:

Variables: N FE EE V O N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (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 O2 N4 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N4
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N4
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N4 *
============================
 <evalExpr {P}> FE EE L LV O2
 < apply IH to R3 A2 _ _ _.

Subgoal 1.32.1.2:

Variables: N FE EE V O N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (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 O2 N4 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N4
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N4
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N4 *
H8 : <evalExpr {P}> FE EE L LV O2
============================
 <evalExpr {P}> FE EE L LV O2
 < search.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
============================
 <evalExpr {P}> FE EE (index L I) V O
 < RP2: assert <evalExpr {P}> FE EE I (intVal Idx) O3.

Subgoal 1.32.2:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
============================
 <evalExpr {P}> FE EE I (intVal Idx) O3
 < Ev1: apply drop_ext_size_evalExpr to R3.

Subgoal 1.32.2:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
Ev1 : evalExpr FE EE L LV O2
============================
 <evalExpr {P}> FE EE I (intVal Idx) O3
 < Or: apply lt_right to R2 _ _ _.

Subgoal 1.32.2:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
Ev1 : evalExpr FE EE L LV O2
Or : N3 < N4 \/ N3 = N4
============================
 <evalExpr {P}> FE EE I (intVal Idx) O3
 < L': case Or.

Subgoal 1.32.2.1:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
Ev1 : evalExpr FE EE L LV O2
L' : N3 < N4
============================
 <evalExpr {P}> FE EE I (intVal Idx) O3
 < L'': apply less_integer_transitive to L' L.

Subgoal 1.32.2.1:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
Ev1 : evalExpr FE EE L LV O2
L' : N3 < N4
L'' : N3 < N
============================
 <evalExpr {P}> FE EE I (intVal Idx) O3
 < A3: apply Acc to _ L''.

Subgoal 1.32.2.1:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
Ev1 : evalExpr FE EE L LV O2
L' : N3 < N4
L'' : N3 < N
A3 : acc N3 *
============================
 <evalExpr {P}> FE EE I (intVal Idx) O3
 < apply IH to R4 A3 _ _ _.

Subgoal 1.32.2.1:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
Ev1 : evalExpr FE EE L LV O2
L' : N3 < N4
L'' : N3 < N
A3 : acc N3 *
H8 : <evalExpr {P}> FE EE I (intVal Idx) O3
============================
 <evalExpr {P}> FE EE I (intVal Idx) O3
 < search.

Subgoal 1.32.2.2:

Variables: N FE EE V O N2 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N4 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N4
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N4
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
Ev1 : evalExpr FE EE L LV O2
============================
 <evalExpr {P}> FE EE I (intVal Idx) O3
 < A3: apply Acc to _ L.

Subgoal 1.32.2.2:

Variables: N FE EE V O N2 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N4 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N4
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N4
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
Ev1 : evalExpr FE EE L LV O2
A3 : acc N4 *
============================
 <evalExpr {P}> FE EE I (intVal Idx) O3
 < apply IH to R4 A3 _ _ _.

Subgoal 1.32.2.2:

Variables: N FE EE V O N2 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_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 O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N4 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N4
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N4
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
Ev1 : evalExpr FE EE L LV O2
A3 : acc N4 *
H8 : <evalExpr {P}> FE EE I (intVal Idx) O3
============================
 <evalExpr {P}> FE EE I (intVal Idx) O3
 < search.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
RP2 : <evalExpr {P}> FE EE I (intVal Idx) O3
============================
 <evalExpr {P}> FE EE (index L I) V O
 < Ev1: apply drop_ext_size_evalExpr to R3.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
RP2 : <evalExpr {P}> FE EE I (intVal Idx) O3
Ev1 : evalExpr FE EE L LV O2
============================
 <evalExpr {P}> FE EE (index L I) V O
 < Ev2: apply drop_ext_size_evalExpr to R4.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
RP2 : <evalExpr {P}> FE EE I (intVal Idx) O3
Ev1 : evalExpr FE EE L LV O2
Ev2 : evalExpr FE EE I (intVal Idx) O3
============================
 <evalExpr {P}> FE EE (index L I) V O
 < IsV1: apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
RP2 : <evalExpr {P}> FE EE I (intVal Idx) O3
Ev1 : evalExpr FE EE L LV O2
Ev2 : evalExpr FE EE I (intVal Idx) O3
IsV1 : is_value LV
============================
 <evalExpr {P}> FE EE (index L I) V O
 < IsV2: apply evalExpr_isValue to _ _ _ Ev2.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
RP2 : <evalExpr {P}> FE EE I (intVal Idx) O3
Ev1 : evalExpr FE EE L LV O2
Ev2 : evalExpr FE EE I (intVal Idx) O3
IsV1 : is_value LV
IsV2 : is_value (intVal Idx)
============================
 <evalExpr {P}> FE EE (index L I) V O
 < Or: apply is_value_eq_or_not to IsV1 IsV2.

Subgoal 1.32:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
RP2 : <evalExpr {P}> FE EE I (intVal Idx) O3
Ev1 : evalExpr FE EE L LV O2
Ev2 : evalExpr FE EE I (intVal Idx) O3
IsV1 : is_value LV
IsV2 : is_value (intVal Idx)
Or : LV = intVal Idx \/ (LV = intVal Idx -> false)
============================
 <evalExpr {P}> FE EE (index L I) V O
 < case Or.

Subgoal 1.32.3:

Variables: N FE EE V O N2 N3 N4 O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L (intVal Idx) O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex (intVal Idx) Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L (intVal Idx) O2
RP2 : <evalExpr {P}> FE EE I (intVal Idx) O3
Ev1 : evalExpr FE EE L (intVal Idx) O2
Ev2 : evalExpr FE EE I (intVal Idx) O3
IsV1 : is_value (intVal Idx)
IsV2 : is_value (intVal Idx)
============================
 <evalExpr {P}> FE EE (index L I) V O
 < search.

Subgoal 1.32.4:

Variables: N FE EE V O N2 N3 N4 LV O2 Idx O3 I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE L LV O2 N2 **
R4 : <evalExpr {ES}> FE EE I (intVal Idx) O3 N3 **
R5 : listIndex LV Idx V
R6 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N4
L : N4 < N
H6 : 0 <= N2
H7 : 0 <= N3
Acc : forall M, 0 <= M -> M < N -> acc M *
RP1 : <evalExpr {P}> FE EE L LV O2
RP2 : <evalExpr {P}> FE EE I (intVal Idx) O3
Ev1 : evalExpr FE EE L LV O2
Ev2 : evalExpr FE EE I (intVal Idx) O3
IsV1 : is_value LV
IsV2 : is_value (intVal Idx)
H8 : LV = intVal Idx -> false
============================
 <evalExpr {P}> FE EE (index L I) V O
 < search.

Subgoal 1.33:

Variables: N FE EE O N2 V1 I E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (looseEval:list:length E1) (intVal I) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (looseEval:list:length E1)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V1 O N2 **
R3 : listLength V1 I
============================
 <evalExpr {P}> FE EE (looseEval:list:length E1) (intVal I) O
 < case IsE.

Subgoal 1.33:

Variables: N FE EE O N2 V1 I E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (looseEval:list:length E1) (intVal I) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 O N2 **
R3 : listLength V1 I
H1 : is_expr E1
============================
 <evalExpr {P}> FE EE (looseEval:list:length E1) (intVal I) O
 < apply ext_size_is_int_evalExpr to R2.

Subgoal 1.33:

Variables: N FE EE O N2 V1 I E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (looseEval:list:length E1) (intVal I) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 O N2 **
R3 : listLength V1 I
H1 : is_expr E1
H2 : is_integer N2
============================
 <evalExpr {P}> FE EE (looseEval:list:length E1) (intVal I) O
 < L: apply lt_plus_one to R1 _.

Subgoal 1.33:

Variables: N FE EE O N2 V1 I E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (looseEval:list:length E1) (intVal I) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 O N2 **
R3 : listLength V1 I
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
============================
 <evalExpr {P}> FE EE (looseEval:list:length E1) (intVal I) O
 < apply ext_size_pos_evalExpr to R2.

Subgoal 1.33:

Variables: N FE EE O N2 V1 I E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (looseEval:list:length E1) (intVal I) O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 O N2 **
R3 : listLength V1 I
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
============================
 <evalExpr {P}> FE EE (looseEval:list:length E1) (intVal I) O
 < Acc: case Acc.

Subgoal 1.33:

Variables: N FE EE O N2 V1 I E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (looseEval:list:length E1) (intVal I) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 O N2 **
R3 : listLength V1 I
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalExpr {P}> FE EE (looseEval:list:length E1) (intVal I) O
 < A: apply Acc to _ L.

Subgoal 1.33:

Variables: N FE EE O N2 V1 I E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (looseEval:list:length E1) (intVal I) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 O N2 **
R3 : listLength V1 I
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
============================
 <evalExpr {P}> FE EE (looseEval:list:length E1) (intVal I) O
 < apply IH to R2 A _ _ _.

Subgoal 1.33:

Variables: N FE EE O N2 V1 I E1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (looseEval:list:length E1) (intVal I) O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_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 O N2 **
R3 : listLength V1 I
H1 : is_expr E1
H2 : is_integer N2
L : N2 < N
H3 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
H4 : <evalExpr {P}> FE EE E1 V1 O
============================
 <evalExpr {P}> FE EE (looseEval:list:length E1) (intVal I) O
 < search.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE 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 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE 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
 < apply ext_size_is_int_evalExpr to R4.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply ext_size_is_int_evalExpr to R5.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
============================
 <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 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply ext_size_pos_evalExpr to R5.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= 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 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
H5 : 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 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
H5 : is_integer N4
L4 : N4 < N
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < Acc': case Acc (keep).

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
H5 : 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
 < L2: assert N2 < N.

Subgoal 4.15.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
 N2 < N
 < Or: apply lt_right to R2 _ _ _.

Subgoal 4.15.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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.15.1.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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.15.1.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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.15.1.2:

Variables: N FE EE EE' O N3 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 + N4 = N4
R3 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N4 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N4
H3 : 0 <= N3
H4 : 0 <= N4
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
 N4 < N
 < search.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
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 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
============================
 N3 < N
 < Or: apply lt_left to R2 _ _.

Subgoal 4.15.2:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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.15.2.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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.15.2.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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.15.2.2:

Variables: N FE EE EE' O N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : N4 + N2 = N4
R3 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N4 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N4
H2 : is_integer N2
H3 : 0 <= N4
H4 : 0 <= N2
H5 : is_integer N4
L4 : N4 < N
Acc' : forall M, 0 <= M -> M < N -> acc M *
L2 : N2 < N
============================
 N4 < N
 < search.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 (listUpdate L I E) EE' O
 < A2: apply Acc' to _ L2.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 (listUpdate L I E) EE' O
 < A3: apply Acc' to _ L3.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvI: apply IH to R4 A3 _ _ _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvE: apply IH to R5 A2 _ _ _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvI': apply drop_ext_size_evalExpr to R4.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvE': apply drop_ext_size_evalExpr to R5.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply evalExpr_isValue to _ _ _ EvI'.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply evalExpr_isValue to _ _ _ EvE'.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < NamesEE: apply names_exists to IsEE.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L N5
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE N5
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < rename N5 to Names.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < IsNames: apply names_is to _ NamesEE.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < IsNames+: assert is_list is_string (L::Names).

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < FrI: apply fresh_name_exists to _ IsNames+ with
          Base = "I".

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names F
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) F
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < FrH: apply fresh_name_exists to _ IsNames+ with
          Base = "Hold".

Subgoal 4.15.3:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names F
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) F
============================
 is_string "Hold"
 < search 6.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names F F1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) F
FrH : fresh_name "Hold" (L::Names) F1
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < FrE: apply fresh_name_exists to _ IsNames+ with
          Base = "E".

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names F F1 F2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) F
FrH : fresh_name "Hold" (L::Names) F1
FrE : fresh_name "E" (L::Names) F2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply fresh_name_is to _ FrI.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names F F1 F2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) F
FrH : fresh_name "Hold" (L::Names) F1
FrE : fresh_name "E" (L::Names) F2
H8 : is_string F
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply fresh_name_is to _ FrE.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names F F1 F2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) F
FrH : fresh_name "Hold" (L::Names) F1
FrE : fresh_name "E" (L::Names) F2
H8 : is_string F
H9 : is_string F2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply fresh_name_is to _ FrH.

Subgoal 4.15.4:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names F F1 F2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) F
FrH : fresh_name "Hold" (L::Names) F1
FrE : fresh_name "E" (L::Names) F2
H8 : is_string F
H9 : is_string F2
============================
 is_string "Hold"
 < search 6.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names F F1 F2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) F
FrH : fresh_name "Hold" (L::Names) F1
FrE : fresh_name "E" (L::Names) F2
H8 : is_string F
H9 : is_string F2
H10 : is_string F1
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < rename F to SaveI.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI F1 F2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) F1
FrE : fresh_name "E" (L::Names) F2
H8 : is_string SaveI
H9 : is_string F2
H10 : is_string F1
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < rename F1 to Hold.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold F2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) F2
H8 : is_string SaveI
H9 : is_string F2
H10 : is_string Hold
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < rename F2 to SaveE.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert SaveE = L -> false.

Subgoal 4.15.5:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
============================
 SaveE = L -> false
 < intros E.

Subgoal 4.15.5:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
E : SaveE = L
============================
 false
 < case E.

Subgoal 4.15.5:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) L
H8 : is_string SaveI
H9 : is_string L
H10 : is_string Hold
============================
 false
 < apply fresh_name_not_mem to FrE _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert SaveI = L -> false.

Subgoal 4.15.6:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
============================
 SaveI = L -> false
 < intros E.

Subgoal 4.15.6:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
E : SaveI = L
============================
 false
 < case E.

Subgoal 4.15.6:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) L
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string L
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
============================
 false
 < apply fresh_name_not_mem to FrI _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < assert Hold = L -> false.

Subgoal 4.15.7:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
============================
 Hold = L -> false
 < intros E.

Subgoal 4.15.7:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
E : Hold = L
============================
 false
 < case E.

Subgoal 4.15.7:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) L
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string L
H11 : SaveE = L -> false
H12 : SaveI = L -> false
============================
 false
 < apply fresh_name_not_mem to FrH _.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = 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 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
============================
 Hold = SaveE -> false
 < intros E.

Subgoal 4.15.8:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
E : Hold = SaveE
============================
 false
 < case E.

Subgoal 4.15.8:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) SaveE
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string SaveE
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : SaveE = L -> false
============================
 false
 < AppE: apply fresh_name_start to _ FrE.

Subgoal 4.15.8:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI SaveE S1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) SaveE
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string SaveE
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : SaveE = L -> false
AppE : "E" ++ S1 = SaveE
============================
 false
 < AppH: apply fresh_name_start to _ FrH.

Subgoal 4.15.8.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI SaveE S1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) SaveE
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string SaveE
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : SaveE = L -> false
AppE : "E" ++ S1 = SaveE
============================
 is_string "Hold"
 < search 6.

Subgoal 4.15.8:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI SaveE S1 S2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) SaveE
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string SaveE
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : SaveE = 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 LV N1 O2 V O3 LV2 E I L Names SaveI S1 S2 L3
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) ("E"::L3)
FrE : fresh_name "E" (L::Names) ("E"::L3)
H8 : is_string SaveI
H9 : is_string ("E"::L3)
H10 : is_string ("E"::L3)
H11 : "E"::L3 = L -> false
H12 : SaveI = L -> false
H13 : "E"::L3 = L -> false
AppH : "Hold" ++ S2 = "E"::L3
H14 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : 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 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
============================
 Hold = SaveI -> false
 < intros E.

Subgoal 4.15.9:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
E : Hold = SaveI
============================
 false
 < case E.

Subgoal 4.15.9:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) SaveI
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string SaveI
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : SaveI = L -> false
H14 : SaveI = SaveE -> false
============================
 false
 < AppI: apply fresh_name_start to _ FrI.

Subgoal 4.15.9:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI SaveE S1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) SaveI
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string SaveI
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : SaveI = L -> false
H14 : SaveI = SaveE -> false
AppI : "I" ++ S1 = SaveI
============================
 false
 < AppH: apply fresh_name_start to _ FrH.

Subgoal 4.15.9.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI SaveE S1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) SaveI
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string SaveI
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : SaveI = L -> false
H14 : 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 LV N1 O2 V O3 LV2 E I L Names SaveI SaveE S1 S2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) SaveI
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string SaveI
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : SaveI = L -> false
H14 : 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 LV N1 O2 V O3 LV2 E I L Names SaveE S1 S2 L3
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) ("I"::L3)
FrH : fresh_name "Hold" (L::Names) ("I"::L3)
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string ("I"::L3)
H9 : is_string SaveE
H10 : is_string ("I"::L3)
H11 : SaveE = L -> false
H12 : "I"::L3 = L -> false
H13 : "I"::L3 = L -> false
H14 : "I"::L3 = SaveE -> false
AppH : "Hold" ++ S2 = "I"::L3
H15 : [] ++ S1 = L3
============================
 false
 < case AppH.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : 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 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
============================
 SaveI = SaveE -> false
 < intros E.

Subgoal 4.15.10:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
E : SaveI = SaveE
============================
 false
 < case E.

Subgoal 4.15.10:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveE
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveE
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveE = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveE -> false
============================
 false
 < AppI: apply fresh_name_start to _ FrI.

Subgoal 4.15.10:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names Hold SaveE S1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveE
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveE
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveE = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveE -> false
AppI : "I" ++ S1 = SaveE
============================
 false
 < AppE: apply fresh_name_start to _ FrE.

Subgoal 4.15.10:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names Hold SaveE S1 S2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveE
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveE
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveE = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : 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 LV N1 O2 V O3 LV2 E I L Names Hold S1 S2 L3
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) ("I"::L3)
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) ("I"::L3)
H8 : is_string ("I"::L3)
H9 : is_string ("I"::L3)
H10 : is_string Hold
H11 : "I"::L3 = L -> false
H12 : "I"::L3 = L -> false
H13 : Hold = L -> false
H14 : Hold = "I"::L3 -> false
H15 : Hold = "I"::L3 -> false
AppE : "E" ++ S2 = "I"::L3
H16 : [] ++ S1 = L3
============================
 false
 < case AppE.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvI: assert <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2.

Subgoal 4.15.11:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
============================
 <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
 < V: apply vars_exist to Is1.

Subgoal 4.15.11:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
V : vars I V1
============================
 <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
 < E: apply evalExpr_rel_exists_ES to _ _ _ _ R4 V _ with
        EE_A = []::EE.

Subgoal 4.15.11:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
V : vars I V1
E : <evalExpr {ES}> FE ([]::EE) I (intVal N1) O2 N3
============================
 <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
 < apply IH to E A3 _ _ _.

Subgoal 4.15.11:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
V : vars I V1
E : <evalExpr {ES}> FE ([]::EE) I (intVal N1) O2 N3
H16 : <evalExpr {P}> FE ([]::EE) I (intVal N1) O2
============================
 <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
 < search 10.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvE: assert <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3.

Subgoal 4.15.12:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
============================
 <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
 < V: apply vars_exist to Is2.

Subgoal 4.15.12:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
V : vars E V1
============================
 <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
 < E: apply evalExpr_rel_exists_ES to _ _ _ _ R5 V _ with
        EE_A = [(SaveI, intVal N1)]::EE.

Subgoal 4.15.12.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
V : vars E V1
============================
 forall X V2,
   mem X V1 -> lookupScopes X EE V2 -> lookupScopes X ([(SaveI, intVal N1)]::EE) V2
 < intros M L.

Subgoal 4.15.12.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1 X V2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
============================
 lookupScopes X ([(SaveI, intVal N1)]::EE) V2
 < MemN: apply lookupScopes_names to L NamesEE.

Subgoal 4.15.12.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1 X V2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
============================
 lookupScopes X ([(SaveI, intVal N1)]::EE) V2
 < assert SaveI = X -> false.

Subgoal 4.15.12.1.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1 X V2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
============================
 SaveI = X -> false
 < intros E.

Subgoal 4.15.12.1.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1 X V2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
E : SaveI = X
============================
 false
 < case E.

Subgoal 4.15.12.1.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names Hold SaveE V1 X V2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) X
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string X
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : X = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = X -> false
NEqIE : X = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy X I) ([(X, intVal N1)]::EE) O2
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
============================
 false
 < apply fresh_name_not_mem to FrI _.

Subgoal 4.15.12.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1 X V2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
V : vars E V1
M : mem X V1
L : lookupScopes X EE V2
MemN : mem X Names
H16 : SaveI = X -> false
============================
 lookupScopes X ([(SaveI, intVal N1)]::EE) V2
 < search.

Subgoal 4.15.12:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
V : vars E V1
E : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE) E V O3 N2
============================
 <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
 < apply IH to E A2 _ _ _.

Subgoal 4.15.12:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE V1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
V : vars E V1
E : <evalExpr {ES}> FE ([(SaveI, intVal N1)]::EE) E V O3 N2
H16 : <evalExpr {P}> FE ([(SaveI, intVal N1)]::EE) E V O3
============================
 <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
 < search.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvAI: assert <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE) [].

Subgoal 4.15.13:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
============================
 <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE) []
 < assert SaveE = SaveI -> false.

Subgoal 4.15.13.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
============================
 SaveE = SaveI -> false
 < intros E.

Subgoal 4.15.13.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
E : SaveE = SaveI
============================
 false
 < case E.

Subgoal 4.15.13.1:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveI
H8 : is_string SaveI
H9 : is_string SaveI
H10 : is_string Hold
H11 : SaveI = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveI -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveI -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveI E) ([(SaveI, V), (SaveI, intVal N1)]::EE) O3
============================
 false
 < backchain NEqIE.

Subgoal 4.15.13:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
H16 : SaveE = SaveI -> false
============================
 <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE) []
 < search.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE) []
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < EvH: assert <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE) (declare intTy Hold (looseEval:list:nil intTy)) ([(Hold, nilVal), (SaveI, intVal N1), (SaveE, V)]::EE) [].

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE) []
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N1), (SaveE, V)]::EE) []
============================
 <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 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE) []
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N1), (SaveE, V)]::EE) []
GEq : N1 >= 0
============================
 <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 HoldL = nilVal SaveI = SaveI SaveE = SaveE G = EE L = L.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE G' LV1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE) []
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N1), (SaveE, V)]::EE) []
GEq : N1 >= 0
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N1), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < IsO3: apply evalExpr_isOutput to _ _ _ EvE'.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE G' LV1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE) []
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N1), (SaveE, V)]::EE) []
GEq : N1 >= 0
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N1), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
IsO3 : is_list is_value O3
============================
 <evalStmt {P}> FE EE (listUpdate L I E) EE' O
 < apply append_nil_output to IsO3.

Subgoal 4.15:

Variables: N FE EE EE' O N3 N2 N4 LV N1 O2 V O3 LV2 E I L Names SaveI Hold SaveE G' LV1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names1 N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names1 N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names1 -> fresh_name "L" (X::Names1) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 : lookupScopes L EE LV
R4 : <evalExpr {ES}> FE EE I (intVal N1) O2 N3 **
R5 : <evalExpr {ES}> FE EE E V O3 N2 **
R6 : updateListIndex LV N1 V LV2
R7 : replaceScopes L LV2 EE EE'
R8 : O2 ++ O3 = O
Is : is_string L
Is1 : is_expr I
Is2 : is_expr E
H1 : is_integer N3
H2 : is_integer N2
H3 : 0 <= N3
H4 : 0 <= N2
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 *
A3 : acc N3 *
EvI : <evalExpr {P}> FE EE I (intVal N1) O2
EvE : <evalExpr {P}> FE EE E V O3
EvI' : evalExpr FE EE I (intVal N1) O2
EvE' : evalExpr FE EE E V O3
H6 : is_value (intVal N1)
H7 : is_value V
NamesEE : names EE Names
IsNames : is_list is_string Names
IsNames+ : is_list is_string (L::Names)
FrI : fresh_name "I" (L::Names) SaveI
FrH : fresh_name "Hold" (L::Names) Hold
FrE : fresh_name "E" (L::Names) SaveE
H8 : is_string SaveI
H9 : is_string SaveE
H10 : is_string Hold
H11 : SaveE = L -> false
H12 : SaveI = L -> false
H13 : Hold = L -> false
H14 : Hold = SaveE -> false
H15 : Hold = SaveI -> false
NEqIE : SaveI = SaveE -> false
EvI1 : <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, intVal N1)]::EE) O2
EvE1 : <evalStmt {P}> FE ([(SaveI, intVal N1)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, intVal N1)]::EE) O3
EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, intVal N1)]::EE) (assign SaveI (name SaveI)) ([(SaveI, intVal N1), (SaveE, V)]::EE) []
EvH : <evalStmt {P}> FE ([(SaveI, intVal N1), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, intVal N1), (SaveE, V)]::EE) []
GEq : N1 >= 0
Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, intVal N1), (SaveE, V)]::EE) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, intVal 0), (SaveE, V)]::G') []
Main1 : replaceScopes L LV1 EE G'
Main2 : flipOnto nilVal LV2 LV1
IsO3 : is_list is_value O3
H16 : 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N4 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
============================
 <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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE 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 O2 O3 Body L X
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
============================
 <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 O2 O3 Body L X N1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
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 O2 O3 Body L X N1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
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 O2 O3 Body L X N1 F
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
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
 < LenEE: apply length_exists_list_pair_string_value to IsEE.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 F N5
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) F
LenEE : length EE 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 O2 O3 Body L X N1 SaveL N5
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE 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 O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < NNS: assert newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE.

Subgoal 4.16.3:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
============================
 newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
 < unfold .

Subgoal 4.16.3:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
============================
 exists N SNames BNames,
   ((((length EE Len /\ drop N ([(SaveL, LV)]::EE) EE) /\
   take N ([(SaveL, LV)]::EE) [[(SaveL, LV)]]) /\
   names [[(SaveL, LV)]] SNames) /\
   names EE BNames) /\
   (forall X, mem X SNames -> mem X BNames -> false)
 < exists 1,
   [SaveL],
   N1.

Subgoal 4.16.3:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
============================
 ((((length EE Len /\ drop 1 ([(SaveL, LV)]::EE) EE) /\
 take 1 ([(SaveL, LV)]::EE) [[(SaveL, LV)]]) /\
 names [[(SaveL, LV)]] [SaveL]) /\
 names EE N1) /\
 (forall X, mem X [SaveL] -> mem X N1 -> false)
 < split.

Subgoal 4.16.3.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
============================
 length EE Len
 < search.

Subgoal 4.16.3.2:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
============================
 drop 1 ([(SaveL, LV)]::EE) EE
 < search.

Subgoal 4.16.3.3:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
============================
 take 1 ([(SaveL, LV)]::EE) [[(SaveL, LV)]]
 < search.

Subgoal 4.16.3.4:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
============================
 names [[(SaveL, LV)]] [SaveL]
 < search.

Subgoal 4.16.3.5:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
============================
 names EE N1
 < search.

Subgoal 4.16.3.6:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
============================
 forall X, mem X [SaveL] -> mem X N1 -> false
 < intros MSL MX.

Subgoal 4.16.3.6:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
MSL : mem X1 [SaveL]
MX : mem X1 N1
============================
 false
 < MSL: case MSL.

Subgoal 4.16.3.6.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
MX : 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 O2 O3 Body L X N1 SaveL Len X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
MX : mem X1 N1
MSL : mem X1 []
============================
 false
 < case MSL.

Subgoal 4.16:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
============================
 <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 O2 O3 Body L X N1 SaveL Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : 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 O2 O3 Body L X N1 SaveL Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) 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 O2 O3 Body L X N1 SaveL Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body EE_A' O3 N3
IL : iterateList FE EE 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 O2 O3 Body L X N1 SaveL Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body EE_A' O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 O2 O3 Body L X N1 SaveL Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body EE_A' O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 O2 O3 Body L X N1 SaveL Len EE_A' N5 SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body EE_A' O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) LV X Body EE_A' O3
NNS' : length EE' Len
NNS'1 : drop N5 EE_A' EE'
NNS'2 : take N5 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 O2 O3 Body L X N1 SaveL Len N5 SNames BNames N6 L1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::L1) O3
NNS' : length EE' Len
NNS'1 : drop N5 ([(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 + N6 = N5
Take1 : take N6 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 O2 O3 Body L X N1 SaveL Len N5 SNames BNames L1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::L1) O3
NNS' : length EE' Len
NNS'1 : drop N5 ([(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 = N5
============================
 <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 O2 O3 Body L X N1 SaveL Len SNames BNames L1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 O2 O3 Body L X N1 SaveL Len SNames BNames L1 N7
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 + N7 = 1
Drop1 : drop N7 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 O2 O3 Body L X N1 SaveL Len SNames BNames L1 N7
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 + N7 = 1
Drop1 : drop N7 L1 EE'
IsN8 : is_integer N7
============================
 <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 O2 O3 Body L X N1 SaveL Len SNames BNames L1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 O2 O3 Body L X N1 SaveL Len SNames BNames L1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 O2 O3 Body L X N1 SaveL Len SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 O2 O3 Body L X N1 SaveL Len SNames BNames N8 L2 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 + N8 = 0
D1 : drop N8 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 O2 O3 Body L X N1 SaveL Len SNames BNames N8 L2 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 + N8 = 0
D1 : drop N8 L2 EE'
GEq : N8 >= 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 O2 O3 Body L X N1 SaveL Len SNames BNames N8 L2 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 + N8 = 0
D1 : drop N8 L2 EE'
GEq : N8 >= 0
H9 : is_integer N8
============================
 X1::L2 = EE'
 < P: assert 1 + -1 = 0.

Subgoal 4.16.4.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 L2 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 + N8 = 0
D1 : drop N8 L2 EE'
GEq : N8 >= 0
H9 : is_integer N8
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 O2 O3 Body L X N1 SaveL Len SNames BNames L2 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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
H9 : 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 O2 O3 Body L X N1 SaveL Len SNames BNames L2 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::(X1::L2)) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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'
H9 : 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 O2 O3 Body L X N1 SaveL Len SNames BNames L1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::L1) O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 O2 O3 Body L X N1 SaveL Len SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 O2 O3 Body L X N1 SaveL Len SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 O2 O3 Body L X N1 SaveL Len SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
============================
 <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 O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < EvWP: assert exists V',
     <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
Or : N3 < N4 \/ N3 = N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
L : N3 < N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
L : N3 < N4
LEq : N8 <= N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
L : N3 < N4
LEq : N8 <= N4
Or : N8 < N4 \/ N8 = N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
L : N3 < N4
LEq : N8 <= N4
L' : N8 < N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
L : N3 < N4
LEq : N8 <= N4
L' : N8 < N4
L9 : N8 < N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
L : N3 < N4
LEq : N8 <= N4
L' : N8 < N4
L9 : N8 < N
H9 : 0 <= N8
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
L : N3 < N4
LEq : N8 <= N4
L' : N8 < N4
L9 : N8 < N
H9 : 0 <= N8
A9 : acc N8 *
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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 Names Fr.

Subgoal 4.16.4.2.1.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
L : N3 < N4
LEq : N8 <= N4
L' : N8 < N4
L9 : N8 < N
H9 : 0 <= N8
A9 : acc N8 *
H10 : <evalStmt {P}> FE ([(SaveL, LV)]::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, LV)]::EE) (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.2.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N4
L : N3 < N4
LEq : N4 <= N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N4
L : N3 < N4
LEq : N4 <= N4
H9 : 0 <= N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N4
L : N3 < N4
LEq : N4 <= N4
H9 : 0 <= N4
A4 : acc N4 *
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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 Names Fr.

Subgoal 4.16.4.2.1.2:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames V'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N4
L : N3 < N4
LEq : N4 <= N4
H9 : 0 <= N4
A4 : acc N4 *
H10 : <evalStmt {P}> FE ([(SaveL, LV)]::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, LV)]::EE) (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.2.2:

Variables: N FE EE EE' O N2 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N4 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N4
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N4 = N8
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.2.2:

Variables: N FE EE EE' O N2 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N4 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N4
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N4 = N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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 Names Fr.

Subgoal 4.16.4.2.2:

Variables: N FE EE EE' O N2 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames V'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N4 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N4
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N4 = N
H9 : <evalStmt {P}> FE ([(SaveL, LV)]::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, LV)]::EE) (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 O2 O3 Body L X N1 SaveL Len SNames BNames N8
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : exists V',
         <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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 O2 O3 Body L X N1 SaveL Len SNames BNames N8 V'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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
 < V: apply vars_exist to IsS1.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < EvE+: apply evalExpr_rel_exists_ES to _ _ _ _ R3 V _ with
           EE_A = []::EE.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV 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 O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV O2
============================
 <evalStmt {P}> FE EE (listForeach X L Body) EE' O
 < unfold .

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV O2
============================
 exists Names S_P EE_P O_P LV O1 O2,
   (<evalExpr {P}> FE EE L LV O1 /\
   (<iterateList {P}> FE EE 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,
   O2,
   O3.

Subgoal 4.16.4:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV O2
============================
 (<evalExpr {P}> FE EE L LV O2 /\
 (<iterateList {P}> FE EE 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.3:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV O2
============================
 <evalExpr {P}> FE EE L LV O2
 < search.

Subgoal 4.16.4.4:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV O2
============================
 <iterateList {P}> FE EE LV X Body EE' O3
 < search.

Subgoal 4.16.4.5:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV 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 SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV O2
============================
 names EE N1
 < search.

Subgoal 4.16.4.7:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV 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.8:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV 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.8:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV 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.8:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV 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.8:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV 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)]::EE,
   O2,
   O3.

Subgoal 4.16.4.8:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV O2
============================
 <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE) O2 /\
 (<evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.8.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV O2
============================
 <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE) O2
 < apply IH to EvE+ A2 _ _ _.

Subgoal 4.16.4.8.1:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV O2
H9 : <evalExpr {P}> FE ([]::EE) L LV O2
============================
 <evalStmt {P}> FE ([]::EE) (declare intTy SaveL L) ([(SaveL, LV)]::EE) O2
 < search.

Subgoal 4.16.4.8.2:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV O2
============================
 <evalStmt {P}> FE ([(SaveL, LV)]::EE) (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.8.3:

Variables: N FE EE EE' O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len SNames BNames N8 V' V
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body EE' O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body ([(SaveL, LV)]::EE') O3 N3
IL : iterateList FE EE LV X Body EE' O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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)]::EE) LV X Body ([(SaveL, LV)]::EE') O3
Plus : 1 + N3 = N8
EvWP : <evalStmt {P}> FE ([(SaveL, LV)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O3
V : vars L V
EvE+ : <evalExpr {ES}> FE ([]::EE) L LV O2 N2
EvE+' : evalExpr FE ([]::EE) L LV O2
============================
 O2 ++ O3 = O
 < search.

Subgoal 4.16.5:

Variables: N FE EE O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len BR S1 AR
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE) 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 O2 O3 Body L X N1 SaveL Len BR S1 AR
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE (S1::BR)
============================
 <evalStmt {P}> FE EE (listForeach X L Body) (S1::BR) O
 < LenBR+: apply names_same_length to NSI LenEE.

Subgoal 4.16.5:

Variables: N FE EE O N2 N3 N4 LV O2 O3 Body L X N1 SaveL Len BR S1 AR
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE (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 O2 O3 Body L X N1 SaveL Len BR S1 AR N'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE (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 O2 O3 Body L X N1 SaveL Len BR S1 AR N'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE (S1::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H9 : 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 O2 O3 Body L X N1 SaveL Len BR S1 AR N'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE (S1::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H9 : 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 O2 O3 Body L X N1 SaveL Len BR S1 AR N'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL1 V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
              exists V',
                <evalStmt {P}> FE ([(SaveL1, V)]::EE) (while (not (null (name SaveL1))) (seq (declare intTy X (head (name SaveL1))) (seq (assign SaveL1 (tail (name SaveL1))) Body))) ([(SaveL1, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL1 V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL1, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL1 ->
            exists V',
              <evalStmt {P}> FE ([(SaveL1, V)]::EE) (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 O2 N2 **
R4 : <iterateList {ES}> FE EE 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 O2
Ev : evalExpr FE EE L LV O2
H7 : is_value LV
A3 : acc N3 *
ILP : <iterateList {P}> FE EE LV X Body (S1::BR) O3
EvE : evalExpr FE EE L LV O2
Names : names EE N1
IsN1 : is_list is_string N1
Fr : fresh_name "L" (X::N1) SaveL
LenEE : length EE Len
NNS : newNameScopes [[(SaveL, LV)]] Len ([(SaveL, LV)]::EE) EE
H8 : is_string SaveL
ILP' : <iterateList {ES}> FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3 N3
IL : iterateList FE EE LV X Body (S1::BR) O3
IL' : iterateList FE ([(SaveL, LV)]::EE) LV X Body (S1::AR) O3
NNS' : newNameScopes [[(SaveL, LV)]] Len AR BR
NSI : names_same EE (S1::BR)
LenBR : length BR N'
LenBR1 : 1 + N' = Len
H9 : 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'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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' nilVal 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 nilVal
IsX : is_string X
IsBody : is_stmt Body
============================
 <iterateList {P}> FE EE' nilVal X Body EE' []
 < search.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
R1 : N2 + N3 = N
R2 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
============================
 <iterateList {P}> FE EE (consVal Hd Tl) X Body EE' O
 < case IsV.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
============================
 <iterateList {P}> FE EE (consVal Hd Tl) X Body EE' O
 < Ev: apply drop_ext_size_evalStmt to R2.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 <iterateList {P}> FE EE (consVal Hd Tl) X Body EE' O
 < IL: apply drop_ext_size_iterateList to R3.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : 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 (consVal Hd Tl) X Body EE' O
 < apply ext_size_is_int_evalStmt to R2.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
============================
 <iterateList {P}> FE EE (consVal Hd Tl) X Body EE' O
 < apply ext_size_is_int_iterateList to R3.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
============================
 <iterateList {P}> FE EE (consVal Hd Tl) X Body EE' O
 < apply plus_integer_is_integer to _ _ R1.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
============================
 <iterateList {P}> FE EE (consVal Hd Tl) X Body EE' O
 < Acc': case Acc (keep).

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
============================
 <iterateList {P}> FE EE (consVal Hd Tl) X Body EE' O
 < apply ext_size_pos_evalStmt to R2.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
============================
 <iterateList {P}> FE EE (consVal Hd Tl) X Body EE' O
 < apply ext_size_pos_iterateList to R3.

Subgoal 5.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
============================
 <iterateList {P}> FE EE (consVal Hd Tl) 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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
L' : N2 < N
A2 : acc N2 *
============================
 <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
 < apply IH9 to R2 A2 _ _ _.

Subgoal 5.2.1.1:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
L' : N2 < N
A2 : acc N2 *
H8 : <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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N
H7 : 0 <= N3
============================
 <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
 < apply IH9 to R2 Acc _ _ _.

Subgoal 5.2.1.2:

Variables: N FE EE X Body EE' O N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N
H7 : 0 <= N3
H8 : <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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
H8 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 <iterateList {P}> FE EE (consVal Hd Tl) 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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
H8 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
============================
 <iterateList {P}> FE EE3 Tl X Body EE' O3
 < IsEE3+: apply evalStmt_isCtx to _ _ _ Ev.

Subgoal 5.2.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
H8 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IsEE3+ : is_list (is_list (is_pair is_string is_value)) (Scope::EE3)
============================
 <iterateList {P}> FE EE3 Tl X Body EE' O3
 < case IsEE3+.

Subgoal 5.2.2:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
H8 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 <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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
H8 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE3
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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
H8 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE3
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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
H8 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE3
L' : N3 < N
A3 : acc N3 *
============================
 <iterateList {P}> FE EE3 Tl X Body EE' O3
 < apply IH10 to R3 A3 _ _ _ _ _.

Subgoal 5.2.2.1:

Variables: N FE EE X Body EE' O N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
H8 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE3
L' : N3 < N
A3 : acc N3 *
H11 : <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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N
H8 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 <iterateList {P}> FE EE3 Tl X Body EE' O3
 < apply IH10 to R3 Acc _ _ _ _ _.

Subgoal 5.2.2.2:

Variables: N FE EE X Body EE' O N2 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N
H8 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE3
H11 : <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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::EE) (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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
R3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
R4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
Ev : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
IL : iterateList FE EE3 Tl X Body EE' O3
H3 : is_integer N2
H4 : is_integer N3
H5 : is_integer N
Acc' : forall M, 0 <= M -> M < N -> acc M *
H6 : 0 <= N2
H7 : 0 <= N3
H8 : <evalStmt {P}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2
H9 : <iterateList {P}> FE EE3 Tl X Body EE' O3
============================
 <iterateList {P}> FE EE (consVal Hd Tl) X Body EE' O
 < search.

Subgoal 6.1:

Variables: FE SaveL X Body EE' Names N'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, nilVal)]::EE')
IsV : is_value nilVal
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE' nilVal X Body EE' [] 0 @@
Plus : 1 + 0 = N'
Acc : acc N' @
Names : names EE' Names
Fr : fresh_name "L" (X::Names) SaveL
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, nilVal)]::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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsV : is_value (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 IsV.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal [].

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) [].

Subgoal 6.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
============================
 <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
 < search 20.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
============================
 X = SaveL -> false
 < intros E.

Subgoal 6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
E : X = SaveL
============================
 false
 < case E.

Subgoal 6.2.2:

Variables: FE SaveL EE Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsX : is_string SaveL
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(SaveL, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl SaveL Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy SaveL (head (name SaveL))) ([(SaveL, Hd)]::([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) [].

Subgoal 6.2.3:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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, consVal Hd Tl)]::EE)
IsX : is_string X
IsBody : is_stmt Body
IL : <iterateList {ES}> FE EE (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd N1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE N1
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
IsEE1 : is_list (is_list (is_pair is_string is_value)) EE
LenEE : length EE Len
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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, consVal Hd Tl)]::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.4:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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.4:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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.4:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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.4.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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.4.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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.4.3:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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.4.4:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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.4.5:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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.4.6:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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.4.6:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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.4.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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.4.6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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, consVal Hd Tl)]::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 _ _ _ _ IL2 NNS.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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.5:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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 IL2.

Subgoal 6.2.5:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
H7 : is_integer N2
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < apply ext_size_pos_evalStmt to IL2.

Subgoal 6.2.5:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
H7 : is_integer N2
H8 : 0 <= N2
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < apply ext_size_pos_iterateList to IL3.

Subgoal 6.2.5:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
H7 : is_integer N2
H8 : 0 <= N2
H9 : 0 <= N3
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < Or: apply lt_left to IL1 _ _.

Subgoal 6.2.5:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
H7 : is_integer N2
H8 : 0 <= N2
H9 : 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.5.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
H7 : is_integer N2
H8 : 0 <= N2
H9 : 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.5.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
H7 : is_integer N2
H8 : 0 <= N2
H9 : 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.5.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
H7 : is_integer N2
H8 : 0 <= N2
H9 : 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.5.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
H7 : is_integer N2
H8 : 0 <= N2
H9 : 0 <= N3
L : N2 < N
L' : N2 < N'
A2 : acc N2 *
H10 : <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.5.2:

Variables: FE SaveL EE X Body EE' O Names N N' N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
H7 : is_integer N
H8 : 0 <= N
H9 : 0 <= N3
============================
 <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
 < A2: apply Acc' to _ LN.

Subgoal 6.2.5.2:

Variables: FE SaveL EE X Body EE' O Names N N' N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
H7 : is_integer N
H8 : 0 <= N
H9 : 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.5.2:

Variables: FE SaveL EE X Body EE' O Names N N' N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : is_integer N
LN : N < N'
H7 : is_integer N
H8 : 0 <= N
H9 : 0 <= N3
A2 : acc N *
H10 : <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 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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, consVal Hd Tl)]::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 IL2.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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, consVal Hd Tl)]::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.6:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A' N1 SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A' N1 SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A' N1 SNames BNames N4
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A' N1 SNames BNames N4
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A' N1 SNames BNames N4
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A' N1 SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len EE_A' N1 SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len AR
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len AR N1 SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len N1 SNames BNames N4 L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len N1 SNames BNames L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames L N5
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames L N5
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer N5
============================
 Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
 < apply plus_integer_unique_addend to _ _ _ Take Drop.

Subgoal 6.2.6.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer 0
============================
 Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
 < Eq: assert L = EE3.

Subgoal 6.2.6.2.1.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer 0
============================
 L = EE3
 < Drop': case Drop1.

Subgoal 6.2.6.2.1.1.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer 0
============================
 EE3 = EE3
 < search.

Subgoal 6.2.6.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames N6 L1 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 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.6.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames N6 L1 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 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.6.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames N6 L1 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 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.6.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames N6 L1 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer 0
Drop' : 1 + N6 = 0
Drop'1 : drop N6 L1 EE3
GEq : N6 >= 0
P : 1 + -1 = 0
H8 : is_integer N6
============================
 X1::L1 = EE3
 < apply plus_integer_unique_addend to _ _ _ P Drop'.

Subgoal 6.2.6.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames L1 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer 0
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE3
GEq : -1 >= 0
P : 1 + -1 = 0
H8 : is_integer -1
============================
 X1::L1 = EE3
 < LEq: case GEq.

Subgoal 6.2.6.2.1.1.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames L1 X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer 0
Drop' : 1 + -1 = 0
Drop'1 : drop -1 L1 EE3
P : 1 + -1 = 0
H8 : is_integer -1
LEq : 0 <= -1
============================
 X1::L1 = EE3
 < case LEq.

Subgoal 6.2.6.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames L
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer 0
Eq : L = EE3
============================
 Scope::([(SaveL, Tl)]::L) = Scope::([(SaveL, Tl)]::EE3)
 < case Eq.

Subgoal 6.2.6.2.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len SNames BNames
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer 0
============================
 Scope::([(SaveL, Tl)]::EE3) = Scope::([(SaveL, Tl)]::EE3)
 < search.

Subgoal 6.2.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd Len BR S AR1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd Len BR S AR1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd Len BR S AR1 N1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd Len BR S AR1 N1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd Len BR S AR1 N1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd Len BR S AR1 N1 N'1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd Len BR S AR1 N1 N'1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer N'1
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < LenBR: case LenBR+.

Subgoal 6.2.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd Len BR S AR1 N1 N'1 N'2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 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.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd Len BR S AR1 N1 N'1 N'2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer N'1
LenBR : length BR N'2
LenBR1 : 1 + N'2 = N'1
H8 : is_integer N'2
============================
 Scope::(S::AR1) = Scope::([(SaveL, Tl)]::(S::BR))
 < LEq: apply newNameScopes_length to NNS+ LenBR.

Subgoal 6.2.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd Len BR S AR1 N1 N'1 N'2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer N'1
LenBR : length BR N'2
LenBR1 : 1 + N'2 = N'1
H8 : 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.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd BR S AR1 N1 N'1 N'2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer N'1
LenBR : length BR N'2
LenBR1 : 1 + N'2 = N'1
H8 : 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.6.2.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope O2 O3 Tl Hd BR S AR1 N1 N'1 N'2
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::(S::BR)) O2 N2 **
IL3 : <iterateList {ES}> FE (S::BR) Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : is_integer N'1
LenBR : length BR N'2
LenBR1 : 1 + N'2 = N'1
H8 : 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 Scope EE3 O2 O3 Tl Hd Len EE_A'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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, consVal Hd Tl)]::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 IL3.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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, consVal Hd Tl)]::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 IL3.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len N1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len N1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 IL2.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 Scope EE3 O2 O3 Tl Hd Len N1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 0 <= N2
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len N1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len N1 N4
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len N1 N4
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : is_list is_string N4
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 Scope EE3 O2 O3 Tl Hd Len N1 N4 F
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 N2 **
IL3 : <iterateList {ES}> FE EE3 Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 O2 O3 Tl Hd Len N1 N4 F Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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.7:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 F Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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.7:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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.7.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 F Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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.7.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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.7.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) F
NS : names_same EE EE''
M : mem X1 Names
H11 : mem X1 N4
============================
 mem X1 (X::N4)
 < search.

Subgoal 6.2.8:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 F Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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.8:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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.8.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 F Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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.8.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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.8.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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.8.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 F Scope' EE'' X1
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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
H11 : mem X1 Names
============================
 mem X1 (X::Names)
 < search.

Subgoal 6.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 O2 O3 Tl Hd Len N1 N4 Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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, consVal Hd Tl)]::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.9:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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, consVal Hd Tl)]::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.9:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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, consVal Hd Tl)]::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.9:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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, consVal Hd Tl)]::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.9.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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, consVal Hd Tl)]::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.9.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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, consVal Hd Tl)]::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.9.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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, consVal Hd Tl)]::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 _ _ _ _ _ IL3 P A N Fr'.

Subgoal 6.2.9.1:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N1 N4 Scope' EE'' V'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N1
H8 : 0 <= N1
H9 : 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
H10 : 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 *
H11 : <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, consVal Hd Tl)]::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.9.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N4 Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N
H8 : 0 <= N
H9 : 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
H10 : 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, consVal Hd Tl)]::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.9.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N4 Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N
H8 : 0 <= N
H9 : 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
H10 : 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, consVal Hd Tl)]::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 _ _ _ _ _ IL3 P A N Fr'.

Subgoal 6.2.9.2:

Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 O2 O3 Tl Hd Len N4 Scope' EE'' V'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N3 **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N3
P : 1 + N3 = N
H8 : 0 <= N
H9 : 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
H10 : 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 *
H11 : <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, consVal Hd Tl)]::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:

Variables: FE SaveL EE X Body EE' O Names N N' N2 O2 O3 Tl Hd Len N1 N4 Scope' EE''
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N
P : 1 + N = N1
H8 : 0 <= N1
H9 : 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
H10 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
============================
 exists V',
   <evalStmt {P}> FE ([(SaveL, consVal Hd Tl)]::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 _ _ _ _ _ IL3 Plus Acc N Fr'.

Subgoal 6.2.10:

Variables: FE SaveL EE X Body EE' O Names N N' N2 O2 O3 Tl Hd Len N1 N4 Scope' EE'' V'
IH : forall N FE EE E V O,
       <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH1 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH2 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE V X Body EE' O,
        <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
        is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W_A : forall FE SaveL V EE X Body EE' O Names N N',
              is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
              is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
              is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ->
              1 + N = N' -> acc N' * -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
              exists V',
                <evalStmt {P}> FE ([(SaveL, V)]::EE) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))) ([(SaveL, V')]::EE') O
IH6 : forall N FE EE E V O,
        <evalExpr {ES}> FE EE E V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O
IH7 : forall N FE EE A V O,
        <evalArgs {ES}> FE EE A V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O
IH8 : forall N FE EE RF V O,
        <evalRecFields {ES}> FE EE RF V O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V O
IH9 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH10 : forall N FE EE V X Body EE' O,
         <iterateList {ES}> FE EE V X Body EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X ->
         is_stmt Body -> <iterateList {P}> FE EE V X Body EE' O
IH_IL_W : forall FE SaveL V EE X Body EE' O Names N N',
            is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) ([(SaveL, V)]::EE) ->
            is_value V -> is_string X -> is_stmt Body -> <iterateList {ES}> FE EE V X Body EE' O N ** ->
            1 + N = N' -> acc N' @ -> names EE Names -> fresh_name "L" (X::Names) SaveL ->
            exists V',
              <evalStmt {P}> FE ([(SaveL, V)]::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 (consVal Hd Tl) 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 : <evalStmt {ES}> FE ([(X, Hd)]::EE) Body (Scope'::EE'') O2 N2 **
IL3 : <iterateList {ES}> FE EE'' Tl X Body EE' O3 N **
IL4 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
H4 : <evalStmt {P}> FE ([]::([(SaveL, consVal Hd Tl)]::EE)) (declare intTy X (head (name SaveL))) ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) []
NEq : X = SaveL -> false
H5 : <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, consVal Hd Tl)]::EE)) (assign SaveL (tail (name SaveL))) ([(X, Hd)]::([(SaveL, Tl)]::EE)) []
IsSaveL : is_string SaveL
IsEE : is_list (is_pair is_string is_value) [(SaveL, consVal Hd Tl)]
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
H6 : 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
H7 : 0 <= N
P : 1 + N = N1
H8 : 0 <= N1
H9 : 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
H10 : is_list is_string N4
Fr' : fresh_name "L" (X::N4) SaveL
NS : names_same EE EE''
H11 : <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, consVal Hd Tl)]::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 looseEval:host:paramName_unique.

Proof completed.
 < Prove_Constraint looseEval:host:proj_paramName_forward.

Proof completed.
 < Prove_Constraint looseEval:host:proj_paramName_back.

Proof completed.
 < Prove looseEval:host:getFunEvalInfo_unique.

Proof completed.
 < Prove_Constraint looseEval:host:proj_getFunEvalInfo_forward.

Proof completed.
 < Prove_Constraint looseEval:host:proj_getFunEvalInfo_back.

Proof completed.
 < Prove looseEval:host:evalProgram_unique.

Proof completed.
 < Prove_Constraint looseEval:host:proj_evalProgram.

Proof completed.
 < Prove_Constraint looseEval:host:proj_evalProgram_back.

Proof completed.
 < Theorem listIndex_typePres :
     forall L I V Ty,
       valueType L (listTy Ty) -> listIndex L I V -> valueType V Ty.

============================
 forall L I V Ty, valueType L (listTy Ty) -> listIndex L I V -> valueType V Ty
 < induction on 2.

IH : forall L I V Ty,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
============================
 forall L I V Ty, valueType L (listTy Ty) -> listIndex L I V @ -> valueType V Ty
 < intros VT LI.

Variables: L I V Ty
IH : forall L I V Ty,
       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: V Ty Tl
IH : forall L I V Ty,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
VT : valueType (consVal V Tl) (listTy Ty)
============================
 valueType V Ty
 < case VT.

Subgoal 1:

Variables: V Ty Tl
IH : forall L I V Ty,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
H1 : valueType V Ty
H2 : valueType Tl (listTy Ty)
============================
 valueType V Ty
 < search.

Subgoal 2:

Variables: I V Ty I1 Tl Hd
IH : forall L I V Ty,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
VT : valueType (consVal Hd Tl) (listTy Ty)
LI : I - 1 = I1
LI1 : listIndex Tl I1 V *
============================
 valueType V Ty
 < case VT.

Subgoal 2:

Variables: I V Ty I1 Tl Hd
IH : forall L I V Ty,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : I - 1 = I1
LI1 : listIndex Tl I1 V *
H1 : valueType Hd Ty
H2 : valueType Tl (listTy Ty)
============================
 valueType V Ty
 < apply IH to _ LI1.

Subgoal 2:

Variables: I V Ty I1 Tl Hd
IH : forall L I V Ty,
       valueType L (listTy Ty) -> listIndex L I V * -> valueType V Ty
LI : I - 1 = I1
LI1 : listIndex Tl I1 V *
H1 : valueType Hd Ty
H2 : valueType Tl (listTy Ty)
H3 : valueType V Ty
============================
 valueType V Ty
 < search.

Proof completed.
 < Theorem updateListIndex_typePres :
     forall L I V L' Ty,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V L' -> valueType L' (listTy Ty).

============================
 forall L I V L' Ty,
   valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V L' -> valueType L' (listTy Ty)
 < induction on 3.

IH : forall L I V L' Ty,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V L' * ->
       valueType L' (listTy Ty)
============================
 forall L I V L' Ty,
   valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V L' @ -> valueType L' (listTy Ty)
 < intros VTL VTV LI.

Variables: L I V L' Ty
IH : forall L I V L' Ty,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V L' * ->
       valueType L' (listTy Ty)
VTL : valueType L (listTy Ty)
VTV : valueType V Ty
LI : updateListIndex L I V L' @
============================
 valueType L' (listTy Ty)
 < LI: case LI.

Subgoal 1:

Variables: V Ty Tl VOld
IH : forall L I V L' Ty,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V L' * ->
       valueType L' (listTy Ty)
VTL : valueType (consVal VOld Tl) (listTy Ty)
VTV : valueType V Ty
============================
 valueType (consVal V Tl) (listTy Ty)
 < case VTL.

Subgoal 1:

Variables: V Ty Tl VOld
IH : forall L I V L' Ty,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V L' * ->
       valueType L' (listTy Ty)
VTV : valueType V Ty
H1 : valueType VOld Ty
H2 : valueType Tl (listTy Ty)
============================
 valueType (consVal V Tl) (listTy Ty)
 < search.

Subgoal 2:

Variables: I V Ty I1 TlNew X Tl
IH : forall L I V L' Ty,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V L' * ->
       valueType L' (listTy Ty)
VTL : valueType (consVal X Tl) (listTy Ty)
VTV : valueType V Ty
LI : I - 1 = I1
LI1 : updateListIndex Tl I1 V TlNew *
============================
 valueType (consVal X TlNew) (listTy Ty)
 < case VTL.

Subgoal 2:

Variables: I V Ty I1 TlNew X Tl
IH : forall L I V L' Ty,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V L' * ->
       valueType L' (listTy Ty)
VTV : valueType V Ty
LI : I - 1 = I1
LI1 : updateListIndex Tl I1 V TlNew *
H1 : valueType X Ty
H2 : valueType Tl (listTy Ty)
============================
 valueType (consVal X TlNew) (listTy Ty)
 < apply IH to _ _ LI1.

Subgoal 2:

Variables: I V Ty I1 TlNew X Tl
IH : forall L I V L' Ty,
       valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V L' * ->
       valueType L' (listTy Ty)
VTV : valueType V Ty
LI : I - 1 = I1
LI1 : updateListIndex Tl I1 V TlNew *
H1 : valueType X Ty
H2 : valueType Tl (listTy Ty)
H3 : valueType TlNew (listTy Ty)
============================
 valueType (consVal X TlNew) (listTy Ty)
 < search.

Proof completed.
 < Prove looseEval:host:evalExpr_typePres,
         looseEval:host:evalStmt_typePres,
         looseEval:host:evalArgs_typePres,
         looseEval: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.26:

Variables: FT ET Ty FE EE Ty1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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) nilVal [] @
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 nilVal Ty
 < case Ty.

Subgoal 1.26:

Variables: FT ET FE EE Ty1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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) nilVal [] @
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 nilVal (listTy Ty1)
 < search.

Subgoal 1.27:

Variables: FT ET Ty FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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) (consVal V1 V2) 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 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
============================
 valueType (consVal V1 V2) Ty
 < case IsE.

Subgoal 1.27:

Variables: FT ET Ty FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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) (consVal V1 V2) 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 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 valueType (consVal V1 V2) Ty
 < Ty: case Ty.

Subgoal 1.27:

Variables: FT ET FE EE O O2 O3 V2 V1 E2 E1 Ty1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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) (consVal V1 V2) 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 O2 *
Ev2 : evalExpr FE EE E2 V2 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 (consVal V1 V2) (listTy Ty1)
 < apply IH_E to _ _ _ _ _ Ty Ev1 _ _.

Subgoal 1.27:

Variables: FT ET FE EE O O2 O3 V2 V1 E2 E1 Ty1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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) (consVal V1 V2) 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 O2 *
Ev2 : evalExpr FE EE E2 V2 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 : valueType V1 Ty1
============================
 valueType (consVal V1 V2) (listTy Ty1)
 < apply IH_E to _ _ _ _ _ Ty1 Ev2 _ _.

Subgoal 1.27:

Variables: FT ET FE EE O O2 O3 V2 V1 E2 E1 Ty1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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) (consVal V1 V2) 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 O2 *
Ev2 : evalExpr FE EE E2 V2 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 : valueType V1 Ty1
H4 : valueType V2 (listTy Ty1)
============================
 valueType (consVal V1 V2) (listTy Ty1)
 < search.

Subgoal 1.28:

Variables: FT ET Ty FE EE O V Tl E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 (consVal V Tl) O *
============================
 valueType V Ty
 < case IsE.

Subgoal 1.28:

Variables: FT ET Ty FE EE O V Tl E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 (consVal V Tl) O *
H1 : is_expr E1
============================
 valueType V Ty
 < Ty: case Ty.

Subgoal 1.28:

Variables: FT ET Ty FE EE O V Tl E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 (consVal V Tl) O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
============================
 valueType V Ty
 < IsV: apply IH_E to _ _ _ _ _ Ty Ev1 _ _.

Subgoal 1.28:

Variables: FT ET Ty FE EE O V Tl E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 (consVal V Tl) O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
IsV : valueType (consVal V Tl) (listTy Ty)
============================
 valueType V Ty
 < case IsV.

Subgoal 1.28:

Variables: FT ET Ty FE EE O V Tl E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 (consVal V Tl) O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty)
H2 : valueType V Ty
H3 : valueType Tl (listTy Ty)
============================
 valueType V Ty
 < search.

Subgoal 1.29:

Variables: FT ET Ty FE EE O V Hd E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 (consVal Hd V) O *
============================
 valueType V Ty
 < case IsE.

Subgoal 1.29:

Variables: FT ET Ty FE EE O V Hd E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 (consVal Hd V) O *
H1 : is_expr E1
============================
 valueType V Ty
 < Ty: case Ty.

Subgoal 1.29:

Variables: FT ET FE EE O V Hd E1 Ty1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 (consVal Hd V) O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
============================
 valueType V (listTy Ty1)
 < IsV: apply IH_E to _ _ _ _ _ Ty Ev1 _ _.

Subgoal 1.29:

Variables: FT ET FE EE O V Hd E1 Ty1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 (consVal Hd V) O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
IsV : valueType (consVal Hd V) (listTy Ty1)
============================
 valueType V (listTy Ty1)
 < case IsV.

Subgoal 1.29:

Variables: FT ET FE EE O V Hd E1 Ty1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 (consVal Hd V) O *
H1 : is_expr E1
Ty : typeOf FT ET E1 (listTy Ty1)
H2 : valueType Hd Ty1
H3 : valueType V (listTy Ty1)
============================
 valueType V (listTy Ty1)
 < search.

Subgoal 1.30:

Variables: FT ET Ty FE EE O E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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) trueVal 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 nilVal O *
============================
 valueType trueVal Ty
 < case Ty.

Subgoal 1.30:

Variables: FT ET FE EE O E1 Ty1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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
Ev : evalExpr FE EE (null E1) trueVal 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 nilVal O *
H1 : typeOf FT ET E1 (listTy Ty1)
============================
 valueType trueVal boolTy
 < search.

Subgoal 1.31:

Variables: FT ET Ty FE EE O Hd Tl E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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) falseVal 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 (consVal Hd Tl) O *
============================
 valueType falseVal Ty
 < case Ty.

Subgoal 1.31:

Variables: FT ET FE EE O Hd Tl E1 Ty1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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
Ev : evalExpr FE EE (null E1) falseVal 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 (consVal Hd Tl) O *
H1 : typeOf FT ET E1 (listTy Ty1)
============================
 valueType falseVal boolTy
 < search.

Subgoal 1.32:

Variables: FT ET Ty FE EE O V LV O2 Idx O3 I L
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 O2 *
Ev2 : evalExpr FE EE I (intVal Idx) O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 valueType V Ty
 < case IsE.

Subgoal 1.32:

Variables: FT ET Ty FE EE O V LV O2 Idx O3 I L
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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 1.32:

Variables: FT ET Ty FE EE O V LV O2 Idx O3 I L
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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_E to _ _ _ _ _ Ty Ev1 _ _.

Subgoal 1.32:

Variables: FT ET Ty FE EE O V LV O2 Idx O3 I L
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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 1.32:

Variables: FT ET Ty FE EE O V LV O2 Idx O3 I L
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 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 O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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 1.33:

Variables: FT ET Ty FE EE O V1 I E1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (looseEval: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 (looseEval:list:length E1) Ty
Ev : evalExpr FE EE (looseEval:list:length E1) (intVal I) 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 O *
Ev2 : listLength V1 I
============================
 valueType (intVal I) Ty
 < case Ty.

Subgoal 1.33:

Variables: FT ET FE EE O V1 I E1 Ty1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (looseEval: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 (looseEval:list:length E1) (intVal I) 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 O *
Ev2 : listLength V1 I
H1 : typeOf FT ET E1 (listTy Ty1)
============================
 valueType (intVal I) intTy
 < search.

Subgoal 2.15:

Variables: FT ET ET' FE EE EE' O LV N O2 V O3 LV2 E I L
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE EE'
Ev6 : O2 ++ O3 = O
============================
 related_all_scopes ET' EE'
 < case IsS.

Subgoal 2.15:

Variables: FT ET ET' FE EE EE' O LV N O2 V O3 LV2 E I L
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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 2.15:

Variables: FT ET' FE EE EE' O LV N O2 V O3 LV2 E I L Ty
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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'
 < VT: apply IH_E to _ _ _ _ _ Ty2 Ev3 _ _.

Subgoal 2.15:

Variables: FT ET' FE EE EE' O LV N O2 V O3 LV2 E I L Ty
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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
VT : valueType V Ty
============================
 related_all_scopes ET' EE'
 < apply related_all_scopes_lookupScopes to _ Ty Ev1.

Subgoal 2.15:

Variables: FT ET' FE EE EE' O LV N O2 V O3 LV2 E I L Ty
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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
VT : valueType V Ty
H4 : valueType LV (listTy Ty)
============================
 related_all_scopes ET' EE'
 < apply updateListIndex_typePres to _ VT Ev4.

Subgoal 2.15:

Variables: FT ET' FE EE EE' O LV N O2 V O3 LV2 E I L Ty
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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
VT : valueType V Ty
H4 : valueType LV (listTy Ty)
H5 : valueType LV2 (listTy Ty)
============================
 related_all_scopes ET' EE'
 < apply related_all_scopes_replaceScopes to _ _ _ Ev5 Ty _.

Subgoal 2.15:

Variables: FT ET' FE EE EE' O LV N O2 V O3 LV2 E I L Ty
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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
VT : valueType V Ty
H4 : valueType LV (listTy Ty)
H5 : valueType LV2 (listTy Ty)
H6 : related_all_scopes ET' EE'
============================
 related_all_scopes ET' EE'
 < search.

Subgoal 2.16:

Variables: FT ET ET' FE EE EE' O LV O2 O3 Body L X
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 O2 *
Ev2 : iterateList FE EE LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 related_all_scopes ET' EE'
 < case IsS.

Subgoal 2.16:

Variables: FT ET ET' FE EE EE' O LV O2 O3 Body L X
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 O2 *
Ev2 : iterateList FE EE 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 2.16:

Variables: FT ET' FE EE EE' O LV O2 O3 Body L X Ty TC1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 O2 *
Ev2 : iterateList FE EE 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'
 < IsLTy: apply typeOf_isTy to _ _ _ Ty.

Subgoal 2.16:

Variables: FT ET' FE EE EE' O LV O2 O3 Body L X Ty TC1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 O2 *
Ev2 : iterateList FE EE 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
IsLTy : is_typ (listTy Ty)
============================
 related_all_scopes ET' EE'
 < case IsLTy.

Subgoal 2.16:

Variables: FT ET' FE EE EE' O LV O2 O3 Body L X Ty TC1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 O2 *
Ev2 : iterateList FE EE 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 : is_typ Ty
============================
 related_all_scopes ET' EE'
 < apply stmtOK_older_scopes_same to _ _ _ Ty1.

Subgoal 2.16:

Variables: FT ET' FE EE EE' O LV O2 O3 Body L X Ty Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 O2 *
Ev2 : iterateList FE EE 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 : is_typ Ty
============================
 related_all_scopes ET' EE'
 < apply evalExpr_isValue to _ _ _ Ev1.

Subgoal 2.16:

Variables: FT ET' FE EE EE' O LV O2 O3 Body L X Ty Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 O2 *
Ev2 : iterateList FE EE 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 : is_typ Ty
H5 : is_value LV
============================
 related_all_scopes ET' EE'
 < apply IH_E to _ _ _ _ _ _ Ev1 _ _.

Subgoal 2.16:

Variables: FT ET' FE EE EE' O LV O2 O3 Body L X Ty Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 O2 *
Ev2 : iterateList FE EE 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 : is_typ Ty
H5 : is_value LV
H6 : valueType LV (listTy Ty)
============================
 related_all_scopes ET' EE'
 < apply IH_IL to _ _ _ _ _ _ _ Ty1 _ _ Ev2 _ _.

Subgoal 2.16:

Variables: FT ET' FE EE EE' O LV O2 O3 Body L X Ty Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 O2 *
Ev2 : iterateList FE EE 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 : is_typ Ty
H5 : is_value LV
H6 : valueType LV (listTy Ty)
H7 : related_all_scopes ET' EE'
============================
 related_all_scopes ET' EE'
 < search.

Subgoal 5.1:

Variables: X Body FT ET Ty Sc ET' FE EE'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 nilVal
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 nilVal (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE' nilVal 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'
============================
 related_all_scopes ET' EE'
 < apply stmtOK_older_scopes_same to _ _ _ Ty.

Subgoal 5.1:

Variables: X Body FT ET Ty FE EE' Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 nilVal
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 nilVal (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE' nilVal 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'
============================
 related_all_scopes ET EE'
 < search.

Subgoal 5.2:

Variables: X Body FT ET Ty Sc ET' FE EE EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd Tl)
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 (consVal Hd Tl) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
============================
 related_all_scopes ET' EE'
 < apply stmtOK_older_scopes_same to _ _ _ Ty.

Subgoal 5.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd Tl)
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 (consVal Hd Tl) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
============================
 related_all_scopes ET EE'
 < case IsV.

Subgoal 5.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd Tl) (listTy Ty)
IsTy : is_typ Ty
IL : iterateList FE EE (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
============================
 related_all_scopes ET EE'
 < case VTy.

Subgoal 5.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
============================
 related_all_scopes ET EE'
 < assert related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE).

Subgoal 5.2.1:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
============================
 related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
 < unfold .

Subgoal 5.2.1.1:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : 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 5.2.1.1:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope' X1 T
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
L : lookup [(X, Ty)] X1 T
============================
 exists V, lookup [(X, Hd)] X1 V /\ valueType V T
 < L: case L.

Subgoal 5.2.1.1.1:

Variables: Body FT ET FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope' X1 T
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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)
IsTy : is_typ T
IL : iterateList FE EE (consVal Hd Tl) 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 : evalStmt FE ([(X1, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X1 Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd T
H4 : valueType Tl (listTy T)
============================
 exists V, lookup [(X1, Hd)] X1 V /\ valueType V T
 < search.

Subgoal 5.2.1.1.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope' X1 T
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : 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 5.2.1.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
============================
 forall X1, no_lookup [(X, Ty)] X1 -> no_lookup [(X, Hd)] X1
 < intros NL.

Subgoal 5.2.1.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope' X1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
NL : no_lookup [(X, Ty)] X1
============================
 no_lookup [(X, Hd)] X1
 < case NL.

Subgoal 5.2.1.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope' X1
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
H5 : X = X1 -> false
H6 : no_lookup [] X1
============================
 no_lookup [(X, Hd)] X1
 < search.

Subgoal 5.2.1.3:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
============================
 related_all_scopes ET EE
 < search.

Subgoal 5.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
H5 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
============================
 related_all_scopes ET EE'
 < Ctxs': apply IH_S to _ _ _ _ _ Ty IL1 _ _.

Subgoal 5.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
H5 : 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 5.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
H5 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
H6 : forall X T,
       lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H7 : forall X, no_lookup Scope' X -> no_lookup Scope X
H8 : related_all_scopes ET EE3
============================
 related_all_scopes ET EE'
 < IsEE3+: apply evalStmt_isCtx to _ _ _ IL1.

Subgoal 5.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
H5 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
H6 : forall X T,
       lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H7 : forall X, no_lookup Scope' X -> no_lookup Scope X
H8 : 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 5.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
H5 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
H6 : forall X T,
       lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H7 : forall X, no_lookup Scope' X -> no_lookup Scope X
H8 : related_all_scopes ET EE3
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 related_all_scopes ET EE'
 < apply IH_IL to _ _ _ _ _ _ _ Ty _ _ IL2 _ _.

Subgoal 5.2:

Variables: X Body FT ET Ty FE EE EE' O Scope EE3 O2 O3 Tl Hd Scope'
IH_E : forall E FT ET Ty FE EE O V,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
         evalExpr FE EE E V O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_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_A : forall A FT ET Tys FE EE O Vs,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
         evalArgs FE EE A Vs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
           lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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_RF : forall RF FT ET FTys FE EE O FVs,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
          evalRecFields FE EE RF FVs O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
            lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (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 (consVal Hd 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 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : valueType Hd Ty
H4 : valueType Tl (listTy Ty)
H5 : related_all_scopes ([(X, Ty)]::ET) ([(X, Hd)]::EE)
H6 : forall X T,
       lookup Scope' X T -> exists V, lookup Scope X V /\ valueType V T
H7 : forall X, no_lookup Scope' X -> no_lookup Scope X
H8 : related_all_scopes ET EE3
H9 : is_list (is_pair is_string is_value) Scope
H10 : is_list (is_list (is_pair is_string is_value)) EE3
H11 : related_all_scopes ET EE'
============================
 related_all_scopes ET EE'
 < search.

Proof completed.
 < Prove looseEval:host:paramTy_paramName_same.

Proof completed.
 < Prove looseEval:host:funOK_getFunEvalInfo_related.

Proof completed.
 < Prove looseEval:host:evalExpr_output_forms,
         looseEval:host:evalStmt_output_forms,
         looseEval:host:evalArgs_output_forms,
         looseEval: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.26:

Variables: FE EE Ty
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) nilVal [] @
============================
 output_forms []
 < search.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
============================
 output_forms O
 < case IsE.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
============================
 output_forms O
 < apply IH_E to _ _ _ Ev2.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
============================
 output_forms O
 < apply output_forms_append to _ _ Ev3.

Subgoal 1.27:

Variables: FE EE O O2 O3 V2 V1 E2 E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) (consVal V1 V2) O @
Ev1 : evalExpr FE EE E1 V1 O2 *
Ev2 : evalExpr FE EE E2 V2 O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr E1
H2 : is_expr E2
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
 output_forms O
 < search.

Subgoal 1.28:

Variables: FE EE V O Tl E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (consVal V Tl) O *
============================
 output_forms O
 < case IsE.

Subgoal 1.28:

Variables: FE EE V O Tl E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (consVal V Tl) O *
H1 : is_expr E1
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.28:

Variables: FE EE V O Tl E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (consVal V Tl) O *
H1 : is_expr E1
H2 : output_forms O
============================
 output_forms O
 < search.

Subgoal 1.29:

Variables: FE EE V O Hd E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (consVal Hd V) O *
============================
 output_forms O
 < case IsE.

Subgoal 1.29:

Variables: FE EE V O Hd E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (consVal Hd V) O *
H1 : is_expr E1
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.29:

Variables: FE EE V O Hd E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE E1 (consVal Hd V) O *
H1 : is_expr E1
H2 : output_forms O
============================
 output_forms O
 < search.

Subgoal 1.30:

Variables: FE EE O E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) trueVal O @
Ev1 : evalExpr FE EE E1 nilVal O *
============================
 output_forms O
 < case IsE.

Subgoal 1.30:

Variables: FE EE O E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) trueVal O @
Ev1 : evalExpr FE EE E1 nilVal O *
H1 : is_expr E1
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.30:

Variables: FE EE O E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) trueVal O @
Ev1 : evalExpr FE EE E1 nilVal O *
H1 : is_expr E1
H2 : output_forms O
============================
 output_forms O
 < search.

Subgoal 1.31:

Variables: FE EE O Hd Tl E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) falseVal O @
Ev1 : evalExpr FE EE E1 (consVal Hd Tl) O *
============================
 output_forms O
 < case IsE.

Subgoal 1.31:

Variables: FE EE O Hd Tl E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) falseVal O @
Ev1 : evalExpr FE EE E1 (consVal Hd Tl) O *
H1 : is_expr E1
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.31:

Variables: FE EE O Hd Tl E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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) falseVal O @
Ev1 : evalExpr FE EE E1 (consVal Hd Tl) O *
H1 : is_expr E1
H2 : output_forms O
============================
 output_forms O
 < search.

Subgoal 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
============================
 output_forms O
 < case IsE.

Subgoal 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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 O LV O2 Idx O3 I L
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) 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 IH_E to _ _ _ Ev2.

Subgoal 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : output_forms O2
H4 : output_forms O3
============================
 output_forms O
 < apply output_forms_append to _ _ Ev4.

Subgoal 1.32:

Variables: FE EE V O LV O2 Idx O3 I L
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O @
Ev1 : evalExpr FE EE L LV O2 *
Ev2 : evalExpr FE EE I (intVal Idx) O3 *
Ev3 : listIndex LV Idx V
Ev4 : O2 ++ O3 = O
H1 : is_expr L
H2 : is_expr I
H3 : output_forms O2
H4 : output_forms O3
H5 : output_forms O
============================
 output_forms O
 < search.

Subgoal 1.33:

Variables: FE EE O V1 I E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 (looseEval: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 (looseEval:list:length E1) (intVal I) O @
Ev1 : evalExpr FE EE E1 V1 O *
Ev2 : listLength V1 I
============================
 output_forms O
 < case IsE.

Subgoal 1.33:

Variables: FE EE O V1 I E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 (looseEval:list:length E1) (intVal I) O @
Ev1 : evalExpr FE EE E1 V1 O *
Ev2 : listLength V1 I
H1 : is_expr E1
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 1.33:

Variables: FE EE O V1 I E1
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 (looseEval:list:length E1) (intVal I) O @
Ev1 : evalExpr FE EE E1 V1 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 LV N O2 V O3 LV2 E I L
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE EE'
Ev6 : O2 ++ O3 = O
============================
 output_forms O
 < case IsS.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
============================
 output_forms O
 < apply IH_E to _ _ _ Ev2.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE 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 IH_E to _ _ _ Ev3.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : output_forms O2
H5 : output_forms O3
============================
 output_forms O
 < apply output_forms_append to _ _ Ev6.

Subgoal 2.15:

Variables: FE EE EE' O LV N O2 V O3 LV2 E I L
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 : lookupScopes L EE LV
Ev2 : evalExpr FE EE I (intVal N) O2 *
Ev3 : evalExpr FE EE E V O3 *
Ev4 : updateListIndex LV N V LV2
Ev5 : replaceScopes L LV2 EE EE'
Ev6 : O2 ++ O3 = O
H1 : is_string L
H2 : is_expr I
H3 : is_expr E
H4 : output_forms O2
H5 : output_forms O3
H6 : output_forms O
============================
 output_forms O
 < search.

Subgoal 2.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : iterateList FE EE LV X Body EE' O3 *
Ev3 : O2 ++ O3 = O
============================
 output_forms O
 < case IsS.

Subgoal 2.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : iterateList FE EE 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 O2 O3 Body L X
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : iterateList FE EE 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_isValue to _ _ _ Ev1.

Subgoal 2.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : iterateList FE EE 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_value LV
============================
 output_forms O
 < apply IH_IL to _ _ _ _ _ Ev2.

Subgoal 2.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : iterateList FE EE 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_value LV
H6 : output_forms O3
============================
 output_forms O
 < apply output_forms_append to _ _ Ev3.

Subgoal 2.16:

Variables: FE EE EE' O LV O2 O3 Body L X
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 O2 *
Ev2 : iterateList FE EE 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_value LV
H6 : output_forms O3
H7 : output_forms O
============================
 output_forms O
 < search.

Subgoal 5.1:

Variables: X Body FE EE'
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 nilVal
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_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' nilVal X Body EE' [] @
============================
 output_forms []
 < search.

Subgoal 5.2:

Variables: X Body FE EE EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 (consVal Hd Tl)
IsX : is_string X
IsBody : is_stmt Body
IsFE : is_list (is_pair is_string (is_pair is_string (is_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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
============================
 output_forms O
 < case IsV.

Subgoal 5.2:

Variables: X Body FE EE EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
============================
 output_forms O
 < apply IH_S to _ _ _ IL1.

Subgoal 5.2:

Variables: X Body FE EE EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : output_forms O2
============================
 output_forms O
 < IsEE3+: apply evalStmt_isCtx to _ _ _ IL1.

Subgoal 5.2:

Variables: X Body FE EE EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : 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 Scope EE3 O2 O3 Tl Hd
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : output_forms O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
============================
 output_forms O
 < apply IH_IL to _ _ _ _ _ IL2.

Subgoal 5.2:

Variables: X Body FE EE EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : output_forms O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : output_forms O3
============================
 output_forms O
 < apply output_forms_append to _ _ IL3.

Subgoal 5.2:

Variables: X Body FE EE EE' O Scope EE3 O2 O3 Tl Hd
IH_E : forall E FE EE 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 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 O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 O * ->
         output_forms O
IH_RF : forall RF FE EE Fields O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (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 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 (consVal Hd Tl) X Body EE' O @
IL1 : evalStmt FE ([(X, Hd)]::EE) Body (Scope::EE3) O2 *
IL2 : iterateList FE EE3 Tl X Body EE' O3 *
IL3 : O2 ++ O3 = O
H1 : is_value Hd
H2 : is_value Tl
H3 : output_forms O2
H4 : is_list (is_pair is_string is_value) Scope
H5 : is_list (is_list (is_pair is_string is_value)) EE3
H6 : output_forms O3
H7 : output_forms O
============================
 output_forms O
 < search.

Proof completed.
 < Prove looseEval:host:evalProgram_output_forms.

Proof completed.
 < Prove looseEval:host:paramName_exists.

Proof completed.
 < Prove looseEval:host:getFunEvalInfo_exists.

Proof completed.
Back to example home