< Module matchEval:list.
< Prove_Constraint matchEval:host:proj_expr_unique. Subgoal 1: Variables: E2 Ty PrA : |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) PrB : |{expr}- nil Ty ~~> E2 IsE : is_expr (nil Ty) ============================ recBuild (consRecFieldExprs "null" true nilRecFieldExprs) = E2
< case PrB. Subgoal 1: Variables: Ty PrA : |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) ============================ recBuild (consRecFieldExprs "null" true nilRecFieldExprs) = recBuild (consRecFieldExprs "null" true nilRecFieldExprs)
< search. Subgoal 2: Variables: E2 E4 E3 PrA : |{expr}- cons E3 E4 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs))) PrB : |{expr}- cons E3 E4 ~~> E2 IsE : is_expr (cons E3 E4) ============================ recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs))) = E2
< case PrB. Subgoal 2: Variables: E4 E3 PrA : |{expr}- cons E3 E4 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs))) IsE : is_expr (cons E3 E4) ============================ recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs))) = recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E3 (consRecFieldExprs "tail" E4 nilRecFieldExprs)))
< search. Subgoal 3: Variables: E2 E3 PrA : |{expr}- null E3 ~~> recFieldAccess E3 "null" PrB : |{expr}- null E3 ~~> E2 IsE : is_expr (null E3) ============================ recFieldAccess E3 "null" = E2
< case PrB. Subgoal 3: Variables: E3 PrA : |{expr}- null E3 ~~> recFieldAccess E3 "null" IsE : is_expr (null E3) ============================ recFieldAccess E3 "null" = recFieldAccess E3 "null"
< search. Subgoal 4: Variables: E2 E3 PrA : |{expr}- head E3 ~~> recFieldAccess E3 "head" PrB : |{expr}- head E3 ~~> E2 IsE : is_expr (head E3) ============================ recFieldAccess E3 "head" = E2
< case PrB. Subgoal 4: Variables: E3 PrA : |{expr}- head E3 ~~> recFieldAccess E3 "head" IsE : is_expr (head E3) ============================ recFieldAccess E3 "head" = recFieldAccess E3 "head"
< search. Subgoal 5: Variables: E2 E3 PrA : |{expr}- tail E3 ~~> recFieldAccess E3 "tail" PrB : |{expr}- tail E3 ~~> E2 IsE : is_expr (tail E3) ============================ recFieldAccess E3 "tail" = E2
< case PrB. Subgoal 5: Variables: E3 PrA : |{expr}- tail E3 ~~> recFieldAccess E3 "tail" IsE : is_expr (tail E3) ============================ recFieldAccess E3 "tail" = recFieldAccess E3 "tail"
< search. Proof completed.
< Prove_Constraint matchEval:host:proj_expr_is. Subgoal 1: Variables: Ty Pr : |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) ============================ is_expr (recBuild (consRecFieldExprs "null" true nilRecFieldExprs))
< case IsE. Subgoal 1: Variables: Ty Pr : |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) H1 : is_typ Ty ============================ is_expr (recBuild (consRecFieldExprs "null" true nilRecFieldExprs))
< search 8. Subgoal 2: Variables: E2 E1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsE : is_expr (cons E1 E2) ============================ is_expr (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))))
< case IsE. Subgoal 2: Variables: E2 E1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) H1 : is_expr E1 H2 : is_expr E2 ============================ is_expr (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))))
< search 10. Subgoal 3: Variables: E1 Pr : |{expr}- null E1 ~~> recFieldAccess E1 "null" IsE : is_expr (null E1) ============================ is_expr (recFieldAccess E1 "null")
< case IsE. Subgoal 3: Variables: E1 Pr : |{expr}- null E1 ~~> recFieldAccess E1 "null" H1 : is_expr E1 ============================ is_expr (recFieldAccess E1 "null")
< search 7. Subgoal 4: Variables: E1 Pr : |{expr}- head E1 ~~> recFieldAccess E1 "head" IsE : is_expr (head E1) ============================ is_expr (recFieldAccess E1 "head")
< case IsE. Subgoal 4: Variables: E1 Pr : |{expr}- head E1 ~~> recFieldAccess E1 "head" H1 : is_expr E1 ============================ is_expr (recFieldAccess E1 "head")
< search 7. Subgoal 5: Variables: E1 Pr : |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsE : is_expr (tail E1) ============================ is_expr (recFieldAccess E1 "tail")
< case IsE. Subgoal 5: Variables: E1 Pr : |{expr}- tail E1 ~~> recFieldAccess E1 "tail" H1 : is_expr E1 ============================ is_expr (recFieldAccess E1 "tail")
< search 7. Proof completed.
< Prove_Constraint matchEval: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::L2) -> mem X (L::L1). 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::L2) -> mem X (L::L1)
< 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::L2) ============================ mem X (L::L1)
< 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::L1)
< 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 L2 ============================ mem X (L::L1)
< apply Rel21 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 L2 H1 : 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::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)))))))))))
< assert forall X, mem X (L::L1) -> mem X (L::L2). 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::L2) -> mem X (L::L1) ============================ forall X, mem X (L::L1) -> mem X (L::L2)
< 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::L2) -> mem X (L::L1) M : mem X (L::L1) ============================ mem X (L::L2)
< M: case M. Subgoal 1.2.1: Variables: L1 L2 Hold 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::L2) -> mem X (L::L1) ============================ mem L (L::L2)
< 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::L2) -> mem X (L::L1) M : mem X L1 ============================ mem X (L::L2)
< apply Rel12 to M. Subgoal 1.2.2: Variables: L1 L2 Hold 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::L2) -> mem X (L::L1) M : mem X L1 H2 : 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::L2) -> mem X (L::L1) H2 : forall X, mem X (L::L1) -> mem X (L::L2) ============================ scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (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::L2) -> mem X (L::L1) H2 : forall X, mem X (L::L1) -> mem X (L::L2) ============================ scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold (nil intTy)) (seq (while (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::L2) -> mem X (L::L1) H2 : forall X, mem X (L::L1) -> mem X (L::L2) ============================ scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (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::L2) -> mem X (L::L1) H2 : forall X, mem X (L::L1) -> mem X (L::L2) ============================ scopeStmt (seq (declare intTy SaveI1 I) (seq (declare intTy SaveE1 E) (seq (assign SaveI1 (name SaveI1)) (seq (declare intTy Hold1 (nil intTy)) (seq (while (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 matchEval: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))))))))))))
< assert is_string "Hold". 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 ============================ 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 "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))))))))))))
< apply fresh_name_is to _ Pr2. 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 "Hold" H6 : is_string Hold ============================ is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (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 "Hold" H6 : is_string Hold H7 : is_string SaveE ============================ is_stmt (scopeStmt (seq (declare intTy SaveI I) (seq (declare intTy SaveE E) (seq (assign SaveI (name SaveI)) (seq (declare intTy Hold (nil intTy)) (seq (while (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 10. Proof completed.
< Prove_Constraint matchEval: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''
< Is': 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 Is' : is_list is_string (L1::L') ============================ exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
< apply fresh_name_exists to _ Is' with Base = "I". Subgoal 1: Variables: L L' Hold 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 Is' : is_list is_string (L1::L') H4 : fresh_name "I" (L1::L') F ============================ exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
< apply fresh_name_exists to _ Is' with Base = "Hold". Subgoal 1.1: Variables: L L' Hold 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 Is' : is_list is_string (L1::L') H4 : fresh_name "I" (L1::L') F ============================ is_string "Hold"
< search 6. Subgoal 1: Variables: L L' Hold 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 Is' : is_list is_string (L1::L') H4 : fresh_name "I" (L1::L') F H5 : fresh_name "Hold" (L1::L') F1 ============================ exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
< apply fresh_name_exists to _ Is' with Base = "E". Subgoal 1: Variables: L L' Hold 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 Is' : is_list is_string (L1::L') H4 : fresh_name "I" (L1::L') F H5 : fresh_name "Hold" (L1::L') F1 H6 : fresh_name "E" (L1::L') F2 ============================ exists S'', L' |{stmt}- listUpdate L1 I E ~~> S''
< search. Subgoal 2: Variables: L L' Body SaveL X L1 Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsS : is_stmt (listForeach X L1 Body) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "L" (X::L) SaveL ============================ exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
< case IsS. Subgoal 2: Variables: L L' Body SaveL X L1 Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "L" (X::L) SaveL H1 : is_string X H2 : is_expr L1 H3 : is_stmt Body ============================ exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
< Is': assert is_list is_string (X::L'). Subgoal 2: Variables: L L' Body SaveL X L1 Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "L" (X::L) SaveL H1 : is_string X H2 : is_expr L1 H3 : is_stmt Body Is' : is_list is_string (X::L') ============================ exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
< apply fresh_name_exists to _ Is' with Base = "L". Subgoal 2: Variables: L L' Body SaveL X L1 F Pr : L |{stmt}- listForeach X L1 Body ~~> scopeStmt (seq (declare intTy SaveL L1) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) IsL : is_list is_string L IsL' : is_list is_string L' Pr1 : fresh_name "L" (X::L) SaveL H1 : is_string X H2 : is_expr L1 H3 : is_stmt Body Is' : is_list is_string (X::L') H4 : fresh_name "L" (X::L') F ============================ exists S'', L' |{stmt}- listForeach X L1 Body ~~> S''
< search. Proof completed.
< Prove_Constraint matchEval:host:proj_fun_unique. Proof completed.
< Prove_Constraint matchEval:host:proj_fun_is. Proof completed.
< Prove_Constraint matchEval:host:proj_param_unique. Proof completed.
< Prove_Constraint matchEval:host:proj_param_is. Proof completed.
< Prove_Constraint matchEval:host:proj_program_unique. Proof completed.
< Prove_Constraint matchEval:host:proj_program_is. Proof completed.
< Prove_Constraint matchEval:host:proj_typ_unique. Variables: T2 T3 PrA : |{typ}- listTy T3 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys))) PrB : |{typ}- listTy T3 ~~> T2 IsT : is_typ (listTy T3) ============================ recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys))) = T2
< case PrB. Variables: T3 PrA : |{typ}- listTy T3 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys))) IsT : is_typ (listTy T3) ============================ recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys))) = recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T3 (consRecFieldTys "tail" (listTy T3) nilRecFieldTys)))
< search. Proof completed.
< Prove_Constraint matchEval:host:proj_typ_is. Variables: T1 Pr : |{typ}- listTy T1 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys))) IsT : is_typ (listTy T1) ============================ is_typ (recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys))))
< case IsT. Variables: T1 Pr : |{typ}- listTy T1 ~~> recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys))) H1 : is_typ T1 ============================ is_typ (recTy (consRecFieldTys "null" boolTy (consRecFieldTys "head" T1 (consRecFieldTys "tail" (listTy T1) nilRecFieldTys))))
< search 11. Proof completed.
< Prove_Constraint matchEval:host:proj_value_unique. Subgoal 1: Variables: V2 PrA : |{value}- nilVal ~~> recVal [("null", trueVal)] PrB : |{value}- nilVal ~~> V2 IsV : is_value nilVal ============================ recVal [("null", trueVal)] = V2
< case PrB. Subgoal 1: PrA : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal ============================ recVal [("null", trueVal)] = recVal [("null", trueVal)]
< search. Subgoal 2: Variables: V2 V4 V3 PrA : |{value}- consVal V3 V4 ~~> recVal [("null", falseVal), ("head", V3), ("tail", V4)] PrB : |{value}- consVal V3 V4 ~~> V2 IsV : is_value (consVal V3 V4) ============================ recVal [("null", falseVal), ("head", V3), ("tail", V4)] = V2
< case PrB. Subgoal 2: Variables: V4 V3 PrA : |{value}- consVal V3 V4 ~~> recVal [("null", falseVal), ("head", V3), ("tail", V4)] IsV : is_value (consVal V3 V4) ============================ recVal [("null", falseVal), ("head", V3), ("tail", V4)] = recVal [("null", falseVal), ("head", V3), ("tail", V4)]
< search. Proof completed.
< Prove_Constraint matchEval:host:proj_value_is. Subgoal 1: Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal ============================ is_value (recVal [("null", trueVal)])
< search 10. Subgoal 2: Variables: V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) ============================ is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
< case IsV. Subgoal 2: Variables: V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] H1 : is_value V1 H2 : is_value V2 ============================ is_value (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
< search 20. Proof completed.
< Add_Proj_Rel matchEval:host:is_expr, matchEval:host:is_args, matchEval:host:is_recFieldExprs. Proof completed.
< Prove_Ext_Ind matchEval:host:is_expr, matchEval:host:is_args, matchEval: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 10. 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 20. 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 10. 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 10. Subgoal 1.24: Variables: Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF 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 10. Proof completed.
< Add_Proj_Rel matchEval:host:is_stmt. Proof completed.
< Prove_Ext_Ind matchEval: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)
< FrI: apply fresh_name_exists to _ _ with Base = "I" Names = [S1]. 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 FrI : fresh_name "I" [S1] F ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< FrH: apply fresh_name_exists to _ _ with Base = "Hold" Names = [S1]. Subgoal 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 FrI : fresh_name "I" [S1] F ============================ is_string "Hold"
< search 7. 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 FrI : fresh_name "I" [S1] F FrH : fresh_name "Hold" [S1] F1 ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< FrE: apply fresh_name_exists to _ _ with Base = "E" Names = [S1]. Subgoal 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 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 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 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 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 7. 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 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)
< assert [] |{stmt}- listUpdate S1 Expr1 Expr ~~> scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (matchEval:list:nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))). 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 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 H4 : [] |{stmt}- listUpdate S1 Expr1 Expr ~~> scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))) ============================ <is_stmt {P}> (listUpdate S1 Expr1 Expr)
< unfold . 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 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 H4 : [] |{stmt}- listUpdate S1 Expr1 Expr ~~> scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))) ============================ exists A1 X_T, (is_string S1 /\ (is_expr Expr1 /\ is_expr Expr)) /\ (A1 |{stmt}- listUpdate S1 Expr1 Expr ~~> X_T /\ <is_stmt {P}> X_T)
< exists [], scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (matchEval:list:nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))). 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 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 H4 : [] |{stmt}- listUpdate S1 Expr1 Expr ~~> scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))) ============================ (is_string S1 /\ (is_expr Expr1 /\ is_expr Expr)) /\ ([] |{stmt}- listUpdate S1 Expr1 Expr ~~> scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))) /\ <is_stmt {P}> (scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1)))))))))))))
< split. Subgoal 10.3: 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 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 H4 : [] |{stmt}- listUpdate S1 Expr1 Expr ~~> scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))) ============================ is_string S1
< search. Subgoal 10.4: 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 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 H4 : [] |{stmt}- listUpdate S1 Expr1 Expr ~~> scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))) ============================ is_expr Expr1
< search. Subgoal 10.5: 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 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 H4 : [] |{stmt}- listUpdate S1 Expr1 Expr ~~> scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))) ============================ is_expr Expr
< search. Subgoal 10.6: 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 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 H4 : [] |{stmt}- listUpdate S1 Expr1 Expr ~~> scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))) ============================ [] |{stmt}- listUpdate S1 Expr1 Expr ~~> scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1)))))))))))
< search. Subgoal 10.7: 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 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 H4 : [] |{stmt}- listUpdate S1 Expr1 Expr ~~> scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))) ============================ <is_stmt {P}> (scopeStmt (seq (declare intTy F Expr1) (seq (declare intTy F2 Expr) (seq (assign F (name F)) (seq (declare intTy F1 (nil intTy)) (seq (while (greater (name F) (num 0)) (seq (assign F (minus (name F) (num 1))) (seq (assign F1 (cons (head (name S1)) (name F1))) (assign S1 (tail (name S1)))))) (seq (assign S1 (cons (name F2) (tail (name S1)))) (while (not (null (name F1))) (seq (assign S1 (cons (head (name F1)) (name S1))) (assign F1 (tail (name F1))))))))))))
< search 20. 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)
< apply IH to R3. 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 * H1 : <is_stmt {P}> 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 * H1 : <is_stmt {P}> 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 * H1 : <is_stmt {P}> Stmt Fr : fresh_name "L" [S1] F H2 : is_string F ============================ <is_stmt {P}> (listForeach S1 Expr Stmt)
< search 20. Proof completed.
< Prove matchEval:host:is_args_nilArgs_or_consArgs. Proof completed.
< Prove matchEval:host:is_recFieldExprs_nilRecFieldExprs_or_consRecFieldExprs. Proof completed.
< Prove matchEval: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. Proof completed.
< Prove matchEval: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. Proof completed.
< Prove matchEval:host:vars_exist, matchEval:host:varsArgs_exist, matchEval: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
< IsV1: 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 IsV1 : is_list is_string V ============================ exists V, vars (cons Expr1 Expr) V
< IsV2: 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 IsV1 : is_list is_string V IsV2 : is_list is_string V1 ============================ exists V, vars (cons Expr1 Expr) V
< apply append_list_string_total to IsV1 IsV2. Subgoal 1.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 IsV1 : is_list is_string V IsV2 : is_list is_string V1 H1 : V ++ V1 = L3 ============================ exists V, vars (cons Expr1 Expr) V
< search. Subgoal 1.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. Proof completed.
< Prove_Constraint matchEval:host:proj_expr_vars. Subgoal 1: Variables: V V_P X Ty Pr : |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) V : vars (nil Ty) V V_P : vars (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) V_P Mem : mem X V ============================ mem X V_P
< case V. Subgoal 1: Variables: V_P X Ty Pr : |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) V_P : vars (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) 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 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsE : is_expr (cons E1 E2) V : vars (cons E1 E2) V V_P : vars (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) 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 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) V : vars (cons E1 E2) V V_P : vars (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) 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 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) V_P : vars (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) 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 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) 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 : varsRecFields (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) V_P ============================ mem X V_P
< V_P: case V_P. Subgoal 2: Variables: V V_P X E2 E1 V2 V3 VE VRest Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) 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 false VE V_P1 : varsRecFields (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)) VRest V_P2 : VE ++ VRest = V_P ============================ mem X V_P
< V_P: case V_P1. Subgoal 2: Variables: V V_P X E2 E1 V2 V3 VE VRest VE1 VRest1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) 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 false VE V_P2 : VE ++ VRest = V_P V_P1 : vars E1 VE1 V_P3 : varsRecFields (consRecFieldExprs "tail" E2 nilRecFieldExprs) VRest1 V_P4 : VE1 ++ VRest1 = VRest ============================ mem X V_P
< V_P: case V_P3. Subgoal 2: Variables: V V_P X E2 E1 V2 V3 VE VRest VE1 VRest1 VE2 VRest2 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) 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 false VE V_P2 : VE ++ VRest = V_P V_P1 : vars E1 VE1 V_P4 : VE1 ++ VRest1 = VRest V_P3 : vars E2 VE2 V_P5 : varsRecFields nilRecFieldExprs VRest2 V_P6 : VE2 ++ VRest2 = VRest1 ============================ mem X V_P
< case V_P5. Subgoal 2: Variables: V V_P X E2 E1 V2 V3 VE VRest VE1 VRest1 VE2 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) 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 false VE V_P2 : VE ++ VRest = V_P V_P1 : vars E1 VE1 V_P4 : VE1 ++ VRest1 = VRest V_P3 : vars E2 VE2 V_P6 : VE2 ++ [] = VRest1 ============================ mem X V_P
< apply append_nil_right to V_P6. Subgoal 2: Variables: V V_P X E2 E1 V2 V3 VE VRest VE1 VRest1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) 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 false VE V_P2 : VE ++ VRest = V_P V_P1 : vars E1 VE1 V_P4 : VE1 ++ VRest1 = VRest V_P3 : vars E2 VRest1 V_P6 : VRest1 ++ [] = VRest1 ============================ mem X V_P
< clear V_P6. Subgoal 2: Variables: V V_P X E2 E1 V2 V3 VE VRest VE1 VRest1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) 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 false VE V_P2 : VE ++ VRest = V_P V_P1 : vars E1 VE1 V_P4 : VE1 ++ VRest1 = VRest V_P3 : vars E2 VRest1 ============================ mem X V_P
< apply vars_unique to _ V V_P1. Subgoal 2: Variables: V V_P X E2 E1 V3 VE VRest VE1 VRest1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Mem : mem X V H1 : is_expr E1 H2 : is_expr E2 V : vars E1 VE1 V1 : vars E2 V3 V2 : VE1 ++ V3 = V V_P : vars false VE V_P2 : VE ++ VRest = V_P V_P1 : vars E1 VE1 V_P4 : VE1 ++ VRest1 = VRest V_P3 : vars E2 VRest1 ============================ mem X V_P
< apply vars_unique to _ V1 V_P3. Subgoal 2: Variables: V V_P X E2 E1 VE VRest VE1 VRest1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Mem : mem X V H1 : is_expr E1 H2 : is_expr E2 V : vars E1 VE1 V1 : vars E2 VRest1 V2 : VE1 ++ VRest1 = V V_P : vars false VE V_P2 : VE ++ VRest = V_P V_P1 : vars E1 VE1 V_P4 : VE1 ++ VRest1 = VRest V_P3 : vars E2 VRest1 ============================ mem X V_P
< apply append_unique to V2 V_P4. Subgoal 2: Variables: V_P X E2 E1 VE VRest VE1 VRest1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Mem : mem X VRest H1 : is_expr E1 H2 : is_expr E2 V : vars E1 VE1 V1 : vars E2 VRest1 V2 : VE1 ++ VRest1 = VRest V_P : vars false VE V_P2 : VE ++ VRest = V_P V_P1 : vars E1 VE1 V_P4 : VE1 ++ VRest1 = VRest V_P3 : vars E2 VRest1 ============================ mem X V_P
< case V_P. Subgoal 2: Variables: V_P X E2 E1 VRest VE1 VRest1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Mem : mem X VRest H1 : is_expr E1 H2 : is_expr E2 V : vars E1 VE1 V1 : vars E2 VRest1 V2 : VE1 ++ VRest1 = VRest V_P2 : [] ++ VRest = V_P V_P1 : vars E1 VE1 V_P4 : VE1 ++ VRest1 = VRest V_P3 : vars E2 VRest1 ============================ mem X V_P
< case V_P2. Subgoal 2: Variables: V_P X E2 E1 VE1 VRest1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) Mem : mem X V_P H1 : is_expr E1 H2 : is_expr E2 V : vars E1 VE1 V1 : vars E2 VRest1 V2 : VE1 ++ VRest1 = V_P V_P1 : vars E1 VE1 V_P4 : VE1 ++ VRest1 = V_P V_P3 : vars E2 VRest1 ============================ mem X V_P
< search. Subgoal 3: Variables: V V_P X E1 Pr : |{expr}- null E1 ~~> recFieldAccess E1 "null" IsE : is_expr (null E1) V : vars (null E1) V V_P : vars (recFieldAccess E1 "null") V_P Mem : mem X V ============================ mem X V_P
< V: case V. Subgoal 3: Variables: V V_P X E1 Pr : |{expr}- null E1 ~~> recFieldAccess E1 "null" IsE : is_expr (null E1) V_P : vars (recFieldAccess E1 "null") V_P Mem : mem X V V : vars E1 V ============================ mem X V_P
< V_P: case V_P. Subgoal 3: Variables: V V_P X E1 Pr : |{expr}- null E1 ~~> recFieldAccess E1 "null" IsE : is_expr (null E1) Mem : mem X V V : vars E1 V V_P : vars E1 V_P ============================ mem X V_P
< case IsE. Subgoal 3: Variables: V V_P X E1 Pr : |{expr}- null E1 ~~> recFieldAccess E1 "null" Mem : mem X V V : vars E1 V V_P : vars E1 V_P H1 : is_expr E1 ============================ mem X V_P
< apply vars_unique to _ V V_P. Subgoal 3: Variables: V_P X E1 Pr : |{expr}- null E1 ~~> recFieldAccess E1 "null" Mem : mem X V_P V : vars E1 V_P V_P : vars E1 V_P H1 : is_expr E1 ============================ mem X V_P
< search. Subgoal 4: Variables: V V_P X E1 Pr : |{expr}- head E1 ~~> recFieldAccess E1 "head" IsE : is_expr (head E1) V : vars (head E1) V V_P : vars (recFieldAccess E1 "head") V_P Mem : mem X V ============================ mem X V_P
< V: case V. Subgoal 4: Variables: V V_P X E1 Pr : |{expr}- head E1 ~~> recFieldAccess E1 "head" IsE : is_expr (head E1) V_P : vars (recFieldAccess E1 "head") V_P Mem : mem X V V : vars E1 V ============================ mem X V_P
< V_P: case V_P. Subgoal 4: Variables: V V_P X E1 Pr : |{expr}- head E1 ~~> recFieldAccess E1 "head" IsE : is_expr (head E1) Mem : mem X V V : vars E1 V V_P : vars E1 V_P ============================ mem X V_P
< case IsE. Subgoal 4: Variables: V V_P X E1 Pr : |{expr}- head E1 ~~> recFieldAccess E1 "head" Mem : mem X V V : vars E1 V V_P : vars E1 V_P H1 : is_expr E1 ============================ mem X V_P
< apply vars_unique to _ V V_P. Subgoal 4: Variables: V_P X E1 Pr : |{expr}- head E1 ~~> recFieldAccess E1 "head" Mem : mem X V_P V : vars E1 V_P V_P : vars E1 V_P H1 : is_expr E1 ============================ mem X V_P
< search. Subgoal 5: Variables: V V_P X E1 Pr : |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsE : is_expr (tail E1) V : vars (tail E1) V V_P : vars (recFieldAccess E1 "tail") V_P Mem : mem X V ============================ mem X V_P
< V: case V. Subgoal 5: Variables: V V_P X E1 Pr : |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsE : is_expr (tail E1) V_P : vars (recFieldAccess E1 "tail") V_P Mem : mem X V V : vars E1 V ============================ mem X V_P
< V_P: case V_P. Subgoal 5: Variables: V V_P X E1 Pr : |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsE : is_expr (tail E1) Mem : mem X V V : vars E1 V V_P : vars E1 V_P ============================ mem X V_P
< case IsE. Subgoal 5: Variables: V V_P X E1 Pr : |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Mem : mem X V V : vars E1 V V_P : vars E1 V_P H1 : is_expr E1 ============================ mem X V_P
< apply vars_unique to _ V V_P. Subgoal 5: Variables: V_P X E1 Pr : |{expr}- tail E1 ~~> recFieldAccess E1 "tail" Mem : mem X V_P V : vars E1 V_P V_P : vars E1 V_P H1 : is_expr E1 ============================ mem X V_P
< search. Proof completed.
< Prove matchEval:host:typeOf_isTy. Subgoal 1.22: Variables: FT ET Ty1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : 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 : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : 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 : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : 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 : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (cons E1 E2) (listTy Ty1) @ Ty1 : typeOf FT ET E1 Ty1 * Ty2 : typeOf FT ET E2 (listTy Ty1) * H1 : is_expr E1 H2 : is_expr E2 ============================ is_typ (listTy Ty1)
< apply IH to _ _ _ Ty1. Subgoal 1.23: Variables: FT ET Ty1 E2 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : 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 : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : 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 : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (head E1) Ty @ Ty1 : typeOf FT ET E1 (listTy Ty) * H1 : is_expr E1 ============================ is_typ Ty
< Is: apply IH to _ _ _ Ty1. Subgoal 1.24: Variables: FT ET Ty E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (head E1) Ty @ Ty1 : typeOf FT ET E1 (listTy Ty) * H1 : is_expr E1 Is : is_typ (listTy Ty) ============================ is_typ Ty
< case Is. Subgoal 1.24: Variables: FT ET Ty E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : 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 : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : 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 : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (tail E1) (listTy Ty1) @ Ty1 : typeOf FT ET E1 (listTy Ty1) * H1 : is_expr E1 ============================ is_typ (listTy Ty1)
< apply IH to _ _ _ Ty1. Subgoal 1.25: Variables: FT ET Ty1 E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : 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 : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall 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 IH2 : 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. Proof completed.
< Prove matchEval: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 matchEval: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 matchEval: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 matchEval: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 matchEval: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 IsE. Subgoal 1.26: Variables: FT ET_A ET_B TyB Ty E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (null E1) boolTy @ TyB : typeOf FT ET_B (null E1) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy Ty) * H1 : is_expr E1 ============================ boolTy = TyB
< TyB: case TyB. Subgoal 1.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 IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (null E1) boolTy @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 (listTy Ty) * H1 : is_expr E1 TyB : typeOf FT ET_B E1 (listTy Ty1) ============================ boolTy = boolTy
< search. Proof completed.
< Prove matchEval:host:stmtOK_unique. Subgoal 12: Variables: FT ET_B ET_A' ET_B' Ty E I L IH : 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 : 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 : 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'
< TyB: case TyB. Subgoal 13: Variables: FT ET_A' ET_B' Ty TC1 Body L X Ty1 TC2 IH : 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 * TyB : typeOf FT ET_B' L (listTy Ty1) TyB1 : stmtOK FT ([(X, Ty1)]::ET_B') Body TC2 ============================ lookup_all_scopes ET_A' ET_B'
< search. Proof completed.
< Prove matchEval:host:paramTy_is. Proof completed.
< Prove matchEval:host:getFunInfo_is. Proof completed.
< Prove matchEval:host:paramTy_exists. Proof completed.
< Prove matchEval:host:getFunInfo_exists. Proof completed.
< Theorem updateListIndex_is : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out -> is_value Out. ============================ forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out -> is_value Out
< induction on 3. IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out ============================ forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out @ -> is_value Out
< intros IsL IsV ULI. Variables: L I V Out IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out IsL : is_value L IsV : is_value V ULI : updateListIndex L I V Out @ ============================ is_value Out
< ULI: case ULI. Subgoal 1: Variables: V Tl VOld IH : forall L I V Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out 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 Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out 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 Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out 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 Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out 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 Out, is_value L -> is_value V -> updateListIndex L I V Out * -> is_value Out 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 matchEval:host:matchInt_is. Proof completed.
< Prove matchEval:host:matchString_is. Proof completed.
< Prove matchEval:host:matchRec_is. Subgoal 2: IH : forall V Fs, is_value V -> matchRec V Fs * -> is_list (is_pair is_string is_value) Fs IsV : is_value nilVal MR : matchRec nilVal [("null", trueVal)] @ ============================ is_list (is_pair is_string is_value) [("null", trueVal)]
< search 10. Subgoal 3: Variables: V2 V1 IH : forall V Fs, is_value V -> matchRec V Fs * -> is_list (is_pair is_string is_value) Fs IsV : is_value (consVal V1 V2) MR : matchRec (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)] @ ============================ is_list (is_pair is_string is_value) [("null", falseVal), ("head", V1), ("tail", V2)]
< case IsV. Subgoal 3: Variables: V2 V1 IH : forall V Fs, is_value V -> matchRec V Fs * -> is_list (is_pair is_string is_value) Fs MR : matchRec (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)] @ H1 : is_value V1 H2 : is_value V2 ============================ is_list (is_pair is_string is_value) [("null", falseVal), ("head", V1), ("tail", V2)]
< search 20. Proof completed.
< Prove matchEval:host:evalExpr_isValue, matchEval:host:evalStmt_isCtx, matchEval:host:evalArgs_isValue, matchEval: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.32: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (nil Ty) nilVal [] @ ============================ is_value nilVal
< case IsE. Subgoal 1.32: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (nil Ty) nilVal [] @ H1 : is_typ Ty ============================ is_value nilVal
< search 10. Subgoal 1.33: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (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.33: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (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.33: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (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.33: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (cons E1 E2) (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 20. Subgoal 1.34: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V O @ Ev1 : evalExpr FE EE E1 (consVal V Tl) O * ============================ is_value V
< case IsE. Subgoal 1.34: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V O @ Ev1 : evalExpr FE EE E1 (consVal V Tl) O * H1 : is_expr E1 ============================ is_value V
< Is: apply IH_V_E to _ _ _ Ev1. Subgoal 1.34: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V O @ Ev1 : evalExpr FE EE E1 (consVal V Tl) O * H1 : is_expr E1 Is : is_value (consVal V Tl) ============================ is_value V
< case Is. Subgoal 1.34: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (head E1) V 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.35: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V O @ Ev1 : evalExpr FE EE E1 (consVal Hd V) O * ============================ is_value V
< case IsE. Subgoal 1.35: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V O @ Ev1 : evalExpr FE EE E1 (consVal Hd V) O * H1 : is_expr E1 ============================ is_value V
< Is: apply IH_V_E to _ _ _ Ev1. Subgoal 1.35: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V O @ Ev1 : evalExpr FE EE E1 (consVal Hd V) O * H1 : is_expr E1 Is : is_value (consVal Hd V) ============================ is_value V
< case Is. Subgoal 1.35: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (tail E1) V 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.36: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) trueVal O @ Ev1 : evalExpr FE EE E1 nilVal O * ============================ is_value trueVal
< search. Subgoal 1.37: 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) falseVal O @ Ev1 : evalExpr FE EE E1 (consVal Hd Tl) O * ============================ is_value falseVal
< search. Subgoal 2.15: Variables: FE EE EE' O LV VI O2 N 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsS : is_stmt (listUpdate L I E) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : lookupScopes L EE LV Ev2 : evalExpr FE EE I VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 VI O2 N 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : lookupScopes L EE LV Ev2 : evalExpr FE EE I VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 VI O2 N 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : lookupScopes L EE LV Ev2 : evalExpr FE EE I VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_value LV ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_V_E to _ _ _ Ev2. Subgoal 2.15: Variables: FE EE EE' O LV VI O2 N 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : lookupScopes L EE LV Ev2 : evalExpr FE EE I VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_value LV H5 : is_value VI ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_V_E to _ _ _ Ev4. Subgoal 2.15: Variables: FE EE EE' O LV VI O2 N 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : lookupScopes L EE LV Ev2 : evalExpr FE EE I VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_value LV H5 : is_value VI H6 : is_value V ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply updateListIndex_is to _ _ Ev5. Subgoal 2.15: Variables: FE EE EE' O LV VI O2 N 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : lookupScopes L EE LV Ev2 : evalExpr FE EE I VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_value LV H5 : is_value VI H6 : is_value V H7 : is_value LV2 ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply replaceScopes_is to _ _ Ev6. Subgoal 2.15: Variables: FE EE EE' O LV VI O2 N 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listUpdate L I E) EE' O @ Ev1 : lookupScopes L EE LV Ev2 : evalExpr FE EE I VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E H4 : is_value LV H5 : is_value VI 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O @ Ev1 : evalExpr FE EE L LV 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsV : is_value 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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsV : is_value (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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (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_list (is_pair is_string is_value) V IH_IL : forall FE EE V X Body EE' O, is_value V -> is_string X -> is_stmt Body -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> iterateList FE EE V X Body EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IsX : is_string X IsBody : is_stmt Body IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IL : iterateList FE EE (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 matchEval:host:evalExpr_isOutput, matchEval:host:evalStmt_isOutput, matchEval:host:evalArgs_isOutput, matchEval: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.32: 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.33: 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.33: 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.33: 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.33: 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.33: 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.34: 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.34: 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.34: 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.35: 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.35: 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.35: 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.36: 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.36: 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.36: 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.37: 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.37: 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.37: 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 2.15: Variables: FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : O2 ++ O3 = O ============================ is_list is_value O
< case IsS. Subgoal 2.15: Variables: FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 _ _ _ Ev4. Subgoal 2.15: Variables: FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 _ _ Ev7. Subgoal 2.15: Variables: FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 matchEval:host:paramName_is. Proof completed.
< Prove matchEval:host:getFunEvalInfo_is. Proof completed.
< Prove matchEval:host:evalProgram_isOutput. Proof completed.
< Prove matchEval: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 VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE (Scope::EE) E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 (Scope::EE) EE' Ev7 : 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 VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE (Scope::EE) E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 (Scope::EE) EE' Ev7 : 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 _ Ev6. Subgoal 1.15: Variables: FE Scope EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE (Scope::EE) E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 (Scope::EE) EE' Ev7 : 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 VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE (Scope::EE) E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 (Scope::EE) (B::BRest) Ev7 : 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.
< 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
< G: 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 G : 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 G : 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 G : I1 >= 0 P : I1 + 1 = I H2 : I >= 0 ============================ I >= 0
< search. Proof completed.
< Theorem updateListIndex_unique : forall L I V OutA OutB, is_value L -> is_value V -> updateListIndex L I V OutA -> updateListIndex L I V OutB -> OutA = OutB. ============================ forall L I V OutA OutB, is_value L -> is_value V -> updateListIndex L I V OutA -> updateListIndex L I V OutB -> OutA = OutB
< induction on 3. IH : forall L I V OutA OutB, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB ============================ forall L I V OutA OutB, is_value L -> is_value V -> updateListIndex L I V OutA @ -> updateListIndex L I V OutB -> OutA = OutB
< intros IsL IsV ULIA ULIB. Variables: L I V OutA OutB IH : forall L I V OutA OutB, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value L IsV : is_value V 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, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal VOld Tl) IsV : is_value V 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, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal VOld Tl) IsV : is_value V ============================ consVal V Tl = consVal V Tl
< search. Subgoal 1.2: Variables: V Tl VOld I1 TlNew IH : forall L I V OutA OutB, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal VOld Tl) IsV : is_value V 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, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal VOld Tl) IsV : is_value V 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, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal VOld Tl) IsV : is_value V 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, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal VOld Tl) IsV : is_value V 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, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal X Tl) IsV : is_value V 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, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal X Tl) IsV : is_value V 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, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal X Tl) IsV : is_value V ULIA : 0 - 1 = -1 ULIA1 : updateListIndex Tl -1 V TlNew * ============================ consVal X TlNew = consVal V Tl
< G: apply updateListIndex_geq_0 to _ ULIA1. Subgoal 2.1: Variables: V TlNew X Tl IH : forall L I V OutA OutB, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal X Tl) IsV : is_value V ULIA : 0 - 1 = -1 ULIA1 : updateListIndex Tl -1 V TlNew * G : -1 >= 0 ============================ consVal X TlNew = consVal V Tl
< G: case G. Subgoal 2.1: Variables: V TlNew X Tl IH : forall L I V OutA OutB, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal X Tl) IsV : is_value V ULIA : 0 - 1 = -1 ULIA1 : updateListIndex Tl -1 V TlNew * G : 0 <= -1 ============================ consVal X TlNew = consVal V Tl
< case G. Subgoal 2.2: Variables: I V I1 TlNew X Tl I2 TlNew1 IH : forall L I V OutA OutB, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal X Tl) IsV : is_value V 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, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsL : is_value (consVal X Tl) IsV : is_value V 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
< case IsL. Subgoal 2.2: Variables: I V TlNew X Tl I2 TlNew1 IH : forall L I V OutA OutB, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsV : is_value V ULIA : I - 1 = I2 ULIA1 : updateListIndex Tl I2 V TlNew * ULIB : I - 1 = I2 ULIB1 : updateListIndex Tl I2 V TlNew1 H1 : is_value X H2 : is_value Tl ============================ 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, is_value L -> is_value V -> updateListIndex L I V OutA * -> updateListIndex L I V OutB -> OutA = OutB IsV : is_value V ULIA : I - 1 = I2 ULIA1 : updateListIndex Tl I2 V TlNew1 * ULIB : I - 1 = I2 ULIB1 : updateListIndex Tl I2 V TlNew1 H1 : is_value X H2 : is_value Tl ============================ consVal X TlNew1 = consVal X TlNew1
< search. Proof completed.
< Prove matchEval:host:matchInt_unique. Proof completed.
< Prove matchEval:host:matchTrue_matchFalse_exclusive. Proof completed.
< Prove matchEval:host:matchString_unique. Proof completed.
< Prove matchEval:host:matchRec_unique. Subgoal 2: Variables: FB IH : forall V FA FB, is_value V -> matchRec V FA * -> matchRec V FB -> FA = FB IsV : is_value nilVal MRA : matchRec nilVal [("null", trueVal)] @ MRB : matchRec nilVal FB ============================ [("null", trueVal)] = FB
< case MRB. Subgoal 2: IH : forall V FA FB, is_value V -> matchRec V FA * -> matchRec V FB -> FA = FB IsV : is_value nilVal MRA : matchRec nilVal [("null", trueVal)] @ ============================ [("null", trueVal)] = [("null", trueVal)]
< search. Subgoal 3: Variables: FB V2 V1 IH : forall V FA FB, is_value V -> matchRec V FA * -> matchRec V FB -> FA = FB IsV : is_value (consVal V1 V2) MRA : matchRec (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)] @ MRB : matchRec (consVal V1 V2) FB ============================ [("null", falseVal), ("head", V1), ("tail", V2)] = FB
< case MRB. Subgoal 3: Variables: V2 V1 IH : forall V FA FB, is_value V -> matchRec V FA * -> matchRec V FB -> FA = FB IsV : is_value (consVal V1 V2) MRA : matchRec (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)] @ ============================ [("null", falseVal), ("head", V1), ("tail", V2)] = [("null", falseVal), ("head", V1), ("tail", V2)]
< search. Proof completed.
< Prove matchEval:host:matchInt_matchTrue_exclusive. Proof completed.
< Prove matchEval:host:matchInt_matchFalse_exclusive. Proof completed.
< Prove matchEval:host:matchInt_matchString_exclusive. Proof completed.
< Prove matchEval:host:matchInt_matchRec_exclusive. Proof completed.
< Prove matchEval:host:matchString_matchTrue_exclusive. Proof completed.
< Prove matchEval:host:matchString_matchFalse_exclusive. Proof completed.
< Prove matchEval:host:matchString_matchRec_exclusive. Proof completed.
< Prove matchEval:host:matchRec_matchTrue_exclusive. Subgoal 2: IH : forall V Fs, is_value V -> matchRec V Fs * -> matchTrue V -> false IsV : is_value nilVal MR : matchRec nilVal [("null", trueVal)] @ MT : matchTrue nilVal ============================ false
< case MT. Subgoal 3: Variables: V2 V1 IH : forall V Fs, is_value V -> matchRec V Fs * -> matchTrue V -> false IsV : is_value (consVal V1 V2) MR : matchRec (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)] @ MT : matchTrue (consVal V1 V2) ============================ false
< case MT. Proof completed.
< Prove matchEval:host:matchRec_matchFalse_exclusive. Subgoal 2: IH : forall V Fs, is_value V -> matchRec V Fs * -> matchFalse V -> false IsV : is_value nilVal MR : matchRec nilVal [("null", trueVal)] @ MF : matchFalse nilVal ============================ false
< case MF. Subgoal 3: Variables: V2 V1 IH : forall V Fs, is_value V -> matchRec V Fs * -> matchFalse V -> false IsV : is_value (consVal V1 V2) MR : matchRec (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)] @ MF : matchFalse (consVal V1 V2) ============================ false
< case MF. Proof completed.
< Prove matchEval:host:evalExpr_rel, matchEval:host:evalExpr_rel_output, matchEval:host:evalStmt_newNameScopes_output, matchEval:host:evalStmt_newNameScopes, matchEval:host:evalArgs_rel, matchEval:host:evalArgs_rel_output, matchEval:host:evalRecFields_rel, matchEval:host:evalRecFields_rel_output 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.32: Variables: FE EE_A EE_B VB O_B Vars Ty IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< case EvB. Subgoal 1.32: Variables: FE EE_A EE_B Vars Ty IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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.33: Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 V2 V1 E2 E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< case IsE. Subgoal 1.33: Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 V2 V1 E2 E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< EvB: case EvB. Subgoal 1.33: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 O3 O4 V4 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 @ 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 EvB : evalExpr FE EE_B E1 V3 O3 EvB1 : evalExpr FE EE_B E2 V4 O4 EvB2 : O3 ++ O4 = O_B ============================ consVal V1 V2 = consVal V3 V4
< Vars: case Vars. Subgoal 1.33: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 V3 O3 EvB1 : evalExpr FE EE_B E2 V4 O4 EvB2 : O3 ++ O4 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars ============================ consVal V1 V2 = consVal V3 V4
< apply IH_V_E to _ _ _ _ EvA1 EvB Vars _. Subgoal 1.33.1: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 V3 O3 EvB1 : evalExpr FE EE_B E2 V4 O4 EvB2 : O3 ++ O4 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars ============================ forall X V, mem X V5 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L. Subgoal 1.33.1: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 X V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 V3 O3 EvB1 : evalExpr FE EE_B E2 V4 O4 EvB2 : O3 ++ O4 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars M : mem X V5 L : lookupScopes X EE_B V ============================ lookupScopes X EE_A V
< apply mem_append_left to M Vars2. Subgoal 1.33.1: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 X V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 V3 O3 EvB1 : evalExpr FE EE_B E2 V4 O4 EvB2 : O3 ++ O4 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars M : mem X V5 L : lookupScopes X EE_B V H3 : mem X Vars ============================ lookupScopes X EE_A V
< backchain Rel. Subgoal 1.33: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 E2 E1 O3 O4 V4 V3 V5 V6 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 V3 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 V3 O1 * EvA2 : evalExpr FE EE_A E2 V2 O2 * EvA3 : O1 ++ O2 = O_A 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 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars ============================ consVal V3 V2 = consVal V3 V4
< apply IH_V_E to _ _ _ _ EvA2 EvB1 Vars1 _. Subgoal 1.33.2: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 E2 E1 O3 O4 V4 V3 V5 V6 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 V3 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 V3 O1 * EvA2 : evalExpr FE EE_A E2 V2 O2 * EvA3 : O1 ++ O2 = O_A 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 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars ============================ forall X V, mem X V6 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L. Subgoal 1.33.2: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 E2 E1 O3 O4 V4 V3 V5 V6 X V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 V3 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 V3 O1 * EvA2 : evalExpr FE EE_A E2 V2 O2 * EvA3 : O1 ++ O2 = O_A 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 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars M : mem X V6 L : lookupScopes X EE_B V ============================ lookupScopes X EE_A V
< apply mem_append_right to M Vars2. Subgoal 1.33.2: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 E2 E1 O3 O4 V4 V3 V5 V6 X V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 V3 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 V3 O1 * EvA2 : evalExpr FE EE_A E2 V2 O2 * EvA3 : O1 ++ O2 = O_A 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 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars M : mem X V6 L : lookupScopes X EE_B V H3 : mem X Vars ============================ lookupScopes X EE_A V
< backchain Rel. Subgoal 1.33: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 E2 E1 O3 O4 V4 V3 V5 V6 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 V3 V4) 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 V3 O1 * EvA2 : evalExpr FE EE_A E2 V4 O2 * EvA3 : O1 ++ O2 = O_A 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 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars ============================ consVal V3 V4 = consVal V3 V4
< search. Subgoal 1.34: Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< case IsE. Subgoal 1.34: Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< EvB: case EvB. Subgoal 1.34: Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1 Tl1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 @ 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 EvB : evalExpr FE EE_B E1 (consVal VB Tl1) O_B ============================ VA = VB
< Vars: case Vars. Subgoal 1.34: Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1 Tl1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 (consVal VB Tl1) O_B Vars : vars E1 Vars ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA1 EvB Vars _. Subgoal 1.34: Variables: FE EE_A EE_B VB O_A O_B Vars E1 Tl1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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_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 VB Tl1) O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (consVal VB Tl1) O_B Vars : vars E1 Vars ============================ VB = VB
< apply evalExpr_isValue to _ _ _ EvA1. Subgoal 1.34: Variables: FE EE_A EE_B VB O_A O_B Vars E1 Tl1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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_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 VB Tl1) O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (consVal VB Tl1) O_B Vars : vars E1 Vars H2 : is_value (consVal VB Tl1) ============================ VB = VB
< search. Subgoal 1.35: Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< case IsE. Subgoal 1.35: Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< EvB: case EvB. Subgoal 1.35: Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1 Hd1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 @ 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 EvB : evalExpr FE EE_B E1 (consVal Hd1 VB) O_B ============================ VA = VB
< Vars: case Vars. Subgoal 1.35: Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1 Hd1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 (consVal Hd1 VB) O_B Vars : vars E1 Vars ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA1 EvB Vars _. Subgoal 1.35: Variables: FE EE_A EE_B VB O_A O_B Vars E1 Hd1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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_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 Hd1 VB) O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (consVal Hd1 VB) O_B Vars : vars E1 Vars ============================ VB = VB
< apply evalExpr_isValue to _ _ _ EvA1. Subgoal 1.35: Variables: FE EE_A EE_B VB O_A O_B Vars E1 Hd1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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_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 Hd1 VB) O_A * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (consVal Hd1 VB) O_B Vars : vars E1 Vars H2 : is_value (consVal Hd1 VB) ============================ VB = VB
< search. Subgoal 1.36: Variables: FE EE_A EE_B VB O_A O_B Vars E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< case IsE. Subgoal 1.36: Variables: FE EE_A EE_B VB O_A O_B Vars E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< Vars: case Vars. Subgoal 1.36: Variables: FE EE_A EE_B VB O_A O_B Vars E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< EvB: case EvB. Subgoal 1.36.1: Variables: FE EE_A EE_B O_A O_B Vars E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< search. Subgoal 1.36.2: Variables: FE EE_A EE_B O_A O_B Vars E1 Hd Tl IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< apply IH_V_E to _ _ _ _ EvA1 EvB Vars _. Subgoal 1.37: Variables: FE EE_A EE_B VB O_A O_B Vars Hd Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< case IsE. Subgoal 1.37: Variables: FE EE_A EE_B VB O_A O_B Vars Hd Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< Vars: case Vars. Subgoal 1.37: Variables: FE EE_A EE_B VB O_A O_B Vars Hd Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< EvB: case EvB. Subgoal 1.37.1: Variables: FE EE_A EE_B O_A O_B Vars Hd Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< apply IH_V_E to _ _ _ _ EvA1 EvB Vars _. Subgoal 1.37.2: Variables: FE EE_A EE_B O_A O_B Vars Hd Tl E1 Hd1 Tl1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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
< search. Subgoal 2.32: Variables: FE EE_A EE_B VB O_B Vars Ty IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ [] = O_B
< case EvB. Subgoal 2.32: Variables: FE EE_A EE_B Vars Ty IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ [] = []
< search. Subgoal 2.33: Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 V2 V1 E2 E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< case IsE. Subgoal 2.33: Variables: FE EE_A EE_B VB O_A O_B Vars O1 O2 V2 V1 E2 E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.33: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 O3 O4 V4 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 @ 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 EvB : evalExpr FE EE_B E1 V3 O3 EvB1 : evalExpr FE EE_B E2 V4 O4 EvB2 : O3 ++ O4 = O_B ============================ O_A = O_B
< Vars: case Vars. Subgoal 2.33: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 V3 O3 EvB1 : evalExpr FE EE_B E2 V4 O4 EvB2 : O3 ++ O4 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB Vars _. Subgoal 2.33.1: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 V3 O3 EvB1 : evalExpr FE EE_B E2 V4 O4 EvB2 : O3 ++ O4 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars ============================ forall X V, mem X V5 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L. Subgoal 2.33.1: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 X V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 V3 O3 EvB1 : evalExpr FE EE_B E2 V4 O4 EvB2 : O3 ++ O4 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars M : mem X V5 L : lookupScopes X EE_B V ============================ lookupScopes X EE_A V
< apply mem_append_left to M Vars2. Subgoal 2.33.1: Variables: FE EE_A EE_B O_A O_B Vars O1 O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 X V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 V3 O3 EvB1 : evalExpr FE EE_B E2 V4 O4 EvB2 : O3 ++ O4 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars M : mem X V5 L : lookupScopes X EE_B V H3 : mem X Vars ============================ lookupScopes X EE_A V
< backchain Rel. Subgoal 2.33: Variables: FE EE_A EE_B O_A O_B Vars O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O3 * EvA2 : evalExpr FE EE_A E2 V2 O2 * EvA3 : O3 ++ O2 = O_A 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 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 Vars1 _. Subgoal 2.33.2: Variables: FE EE_A EE_B O_A O_B Vars O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O3 * EvA2 : evalExpr FE EE_A E2 V2 O2 * EvA3 : O3 ++ O2 = O_A 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 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars ============================ forall X V, mem X V6 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L. Subgoal 2.33.2: Variables: FE EE_A EE_B O_A O_B Vars O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 X V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O3 * EvA2 : evalExpr FE EE_A E2 V2 O2 * EvA3 : O3 ++ O2 = O_A 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 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars M : mem X V6 L : lookupScopes X EE_B V ============================ lookupScopes X EE_A V
< apply mem_append_right to M Vars2. Subgoal 2.33.2: Variables: FE EE_A EE_B O_A O_B Vars O2 V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 X V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O3 * EvA2 : evalExpr FE EE_A E2 V2 O2 * EvA3 : O3 ++ O2 = O_A 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 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars M : mem X V6 L : lookupScopes X EE_B V H3 : mem X Vars ============================ lookupScopes X EE_A V
< backchain Rel. Subgoal 2.33: Variables: FE EE_A EE_B O_A O_B Vars V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O3 * EvA2 : evalExpr FE EE_A E2 V2 O4 * EvA3 : O3 ++ O4 = O_A 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 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars ============================ O_A = O_B
< apply append_unique to EvA3 EvB2. Subgoal 2.33: Variables: FE EE_A EE_B O_B Vars V2 V1 E2 E1 O3 O4 V4 V3 V5 V6 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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_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 O3 * EvA2 : evalExpr FE EE_A E2 V2 O4 * EvA3 : O3 ++ O4 = O_B 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 = O_B Vars : vars E1 V5 Vars1 : vars E2 V6 Vars2 : V5 ++ V6 = Vars ============================ O_B = O_B
< search. Subgoal 2.34: Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 * ============================ O_A = O_B
< case IsE. Subgoal 2.34: Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.34: Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1 Tl1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 @ 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 EvB : evalExpr FE EE_B E1 (consVal VB Tl1) O_B ============================ O_A = O_B
< Vars: case Vars. Subgoal 2.34: Variables: FE EE_A EE_B VA VB O_A O_B Vars Tl E1 Tl1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 (consVal VB Tl1) O_B Vars : vars E1 Vars ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _ _. Subgoal 2.34: Variables: FE EE_A EE_B VA VB O_B Vars Tl E1 Tl1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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_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_B * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (consVal VB Tl1) O_B Vars : vars E1 Vars ============================ O_B = O_B
< search. Subgoal 2.35: Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 * ============================ O_A = O_B
< case IsE. Subgoal 2.35: Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.35: Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1 Hd1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 @ 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 EvB : evalExpr FE EE_B E1 (consVal Hd1 VB) O_B ============================ O_A = O_B
< Vars: case Vars. Subgoal 2.35: Variables: FE EE_A EE_B VA VB O_A O_B Vars Hd E1 Hd1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 EvB : evalExpr FE EE_B E1 (consVal Hd1 VB) O_B Vars : vars E1 Vars ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _ _. Subgoal 2.35: Variables: FE EE_A EE_B VA VB O_B Vars Hd E1 Hd1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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_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_B * H1 : is_expr E1 EvB : evalExpr FE EE_B E1 (consVal Hd1 VB) O_B Vars : vars E1 Vars ============================ O_B = O_B
< search. Subgoal 2.36: Variables: FE EE_A EE_B VB O_A O_B Vars E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 * ============================ O_A = O_B
< case IsE. Subgoal 2.36: Variables: FE EE_A EE_B VB O_A O_B Vars E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< Vars: case Vars. Subgoal 2.36: Variables: FE EE_A EE_B VB O_A O_B Vars E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.36.1: Variables: FE EE_A EE_B O_A O_B Vars E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _ _. Subgoal 2.36.1: Variables: FE EE_A EE_B O_B Vars E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_B = O_B
< search. Subgoal 2.36.2: Variables: FE EE_A EE_B O_A O_B Vars E1 Hd Tl IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _ _. Subgoal 2.36.2: Variables: FE EE_A EE_B O_B Vars E1 Hd Tl IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 (consVal Hd Tl) O_B ============================ O_B = O_B
< search. Subgoal 2.37: Variables: FE EE_A EE_B VB O_A O_B Vars Hd Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 * ============================ O_A = O_B
< case IsE. Subgoal 2.37: Variables: FE EE_A EE_B VB O_A O_B Vars Hd Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< Vars: case Vars. Subgoal 2.37: Variables: FE EE_A EE_B VB O_A O_B Vars Hd Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.37.1: Variables: FE EE_A EE_B O_A O_B Vars Hd Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _ _. Subgoal 2.37.1: Variables: FE EE_A EE_B O_B Vars Hd Tl E1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 Hd Tl) O_B * H1 : is_expr E1 Vars : vars E1 Vars EvB : evalExpr FE EE_B E1 nilVal O_B ============================ O_B = O_B
< search. Subgoal 2.37.2: Variables: FE EE_A EE_B O_A O_B Vars Hd Tl E1 Hd1 Tl1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _ _. Subgoal 2.37.2: Variables: FE EE_A EE_B O_B Vars Hd Tl E1 Hd1 Tl1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 Hd Tl) O_B * H1 : is_expr E1 Vars : vars E1 Vars EvB : evalExpr FE EE_B E1 (consVal Hd1 Tl1) O_B ============================ 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 VI O1 N1 V O2 LV2 E I L IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A ============================ O_A = O_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 VI O1 N1 V O2 LV2 E I L IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E ============================ O_A = O_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 VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B ============================ O_A = O_B
< VI: 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 VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA2 EvB1 VI _. Subgoal 3.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 ============================ forall X V, mem X V2 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
< intros _ LSB. Subgoal 3.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 X V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 H1 : mem X V2 LSB : lookupScopes X (Scope::EE_B) V3 ============================ lookupScopes X (Scope::EE_A) V3
< apply lookupScopes_is_key to _ LSB. Subgoal 3.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 X V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 H1 : mem X V2 LSB : lookupScopes X (Scope::EE_B) V3 H2 : is_string X ============================ lookupScopes X (Scope::EE_A) V3
< apply newNameScopes_lookupScopes to _ _ _ LSB. Subgoal 3.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 X V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 H1 : mem X V2 LSB : lookupScopes X (Scope::EE_B) V3 H2 : is_string X H3 : lookupScopes X (Scope::EE_A) V3 ============================ lookupScopes X (Scope::EE_A) V3
< search. Subgoal 3.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O3 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O3 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 ============================ O_A = O_B
< VE: 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 VI N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O3 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O3 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA4 EvB3 VE _. Subgoal 3.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O3 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O3 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 ============================ forall X V, mem X V3 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
< intros _ LSB. Subgoal 3.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 X V4 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O3 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O3 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 H1 : mem X V3 LSB : lookupScopes X (Scope::EE_B) V4 ============================ lookupScopes X (Scope::EE_A) V4
< apply lookupScopes_is_key to _ LSB. Subgoal 3.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 X V4 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O3 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O3 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 H1 : mem X V3 LSB : lookupScopes X (Scope::EE_B) V4 H2 : is_string X ============================ lookupScopes X (Scope::EE_A) V4
< apply newNameScopes_lookupScopes to _ _ _ LSB. Subgoal 3.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 X V4 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O3 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O3 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 H1 : mem X V3 LSB : lookupScopes X (Scope::EE_B) V4 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 VI N1 V LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O3 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O4 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O3 ++ O4 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 ============================ O_A = O_B
< L: apply newNameScopes_lookupScopes to _ _ _ EvB with A = Scope::EE_A. Subgoal 3.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI N1 V LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O3 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O4 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O3 ++ O4 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV1 ============================ O_A = O_B
< apply lookupScopes_unique to L EvA1. Subgoal 3.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI N1 V LV2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O3 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O4 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O3 ++ O4 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV ============================ O_A = O_B
< apply append_unique to EvA7 EvB6. Subgoal 3.15: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope LV VI N1 V LV2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O3 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O4 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O3 ++ O4 = O_B Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV ============================ O_B = O_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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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_O_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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 _ 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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 H1 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 ============================ lookupScopes X1 (Scope::EE_A) V1
< apply lookupScopes_is_key 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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 H1 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 H1 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 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 LV O2 Body L X LV1 O3 O4 V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O3 * EvA2 : iterateList FE (Scope::EE_A) LV 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_V_E to _ _ _ _ EvA1 EvB V _. Subgoal 3.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O2 Body L X LV1 O3 O4 V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O3 * EvA2 : iterateList FE (Scope::EE_A) LV 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 _ LSB. Subgoal 3.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O2 Body L X LV1 O3 O4 V X1 V1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O3 * EvA2 : iterateList FE (Scope::EE_A) LV 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 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 ============================ lookupScopes X1 (Scope::EE_A) V1
< apply lookupScopes_is_key to _ LSB. Subgoal 3.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O2 Body L X LV1 O3 O4 V X1 V1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O3 * EvA2 : iterateList FE (Scope::EE_A) LV 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 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 H2 : is_string X1 ============================ lookupScopes X1 (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ _ LSB. Subgoal 3.16.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O2 Body L X LV1 O3 O4 V X1 V1 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O3 * EvA2 : iterateList FE (Scope::EE_A) LV 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 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 3.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 3.16: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope Body L X LV1 O3 O4 V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A ============================ newNameScopes N Len EE_A' EE_B'
< Is: case IsS. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B ============================ newNameScopes N Len EE_A' EE_B'
< VI: apply vars_exist to Is1. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA2 EvB1 VI _. Subgoal 4.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 ============================ forall X V, mem X V2 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
< intros _ LSB. Subgoal 4.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 X V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 H1 : mem X V2 LSB : lookupScopes X (Scope::EE_B) V3 ============================ lookupScopes X (Scope::EE_A) V3
< apply lookupScopes_is_key to _ LSB. Subgoal 4.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 X V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 H1 : mem X V2 LSB : lookupScopes X (Scope::EE_B) V3 H2 : is_string X ============================ lookupScopes X (Scope::EE_A) V3
< apply newNameScopes_lookupScopes to _ _ _ LSB. Subgoal 4.15.1: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV VI O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 X V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI O1 * EvA3 : matchInt VI N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 H1 : mem X V2 LSB : lookupScopes X (Scope::EE_B) V3 H2 : is_string X H3 : lookupScopes X (Scope::EE_A) V3 ============================ lookupScopes X (Scope::EE_A) V3
< search. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 ============================ newNameScopes N Len EE_A' EE_B'
< VE: apply vars_exist to Is2. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_V_E to _ _ _ _ EvA4 EvB3 VE _. Subgoal 4.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 ============================ forall X V, mem X V3 -> lookupScopes X (Scope::EE_B) V -> lookupScopes X (Scope::EE_A) V
< intros _ LSB. Subgoal 4.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 X V4 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 H1 : mem X V3 LSB : lookupScopes X (Scope::EE_B) V4 ============================ lookupScopes X (Scope::EE_A) V4
< apply lookupScopes_is_key to _ LSB. Subgoal 4.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 X V4 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 H1 : mem X V3 LSB : lookupScopes X (Scope::EE_B) V4 H2 : is_string X ============================ lookupScopes X (Scope::EE_A) V4
< apply newNameScopes_lookupScopes to _ _ _ LSB. Subgoal 4.15.2: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 N1 V O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 X V4 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE (Scope::EE_A) E V O2 * EvA5 : updateListIndex LV N1 V LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 H1 : mem X V3 LSB : lookupScopes X (Scope::EE_B) V4 H2 : is_string X H3 : lookupScopes X (Scope::EE_A) V4 ============================ lookupScopes X (Scope::EE_A) V4
< search. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 N1 O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N1 V1 LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 ============================ newNameScopes N Len EE_A' EE_B'
< L: apply newNameScopes_lookupScopes to _ _ _ EvB with A = Scope::EE_A. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 N1 O2 LV2 E I L LV1 VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N1 V1 LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV1 EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV1 N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV1 ============================ newNameScopes N Len EE_A' EE_B'
< apply lookupScopes_unique to L EvA1. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 N1 O2 LV2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N1 V1 LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isValue to _ _ _ EvA2. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 N1 O2 LV2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N1 V1 LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV H1 : is_value VI1 ============================ newNameScopes N Len EE_A' EE_B'
< apply evalExpr_isValue to _ _ _ EvA4. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 N1 O2 LV2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N1 V1 LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV H1 : is_value VI1 H2 : is_value V1 ============================ newNameScopes N Len EE_A' EE_B'
< apply matchInt_unique to _ EvA3 EvB2. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 LV2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N2 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N2 V1 LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV H1 : is_value VI1 H2 : is_value V1 ============================ newNameScopes N Len EE_A' EE_B'
< apply lookupScopes_is to _ EvA1. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 LV2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N2 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N2 V1 LV2 EvA6 : replaceScopes L LV2 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV H1 : is_value VI1 H2 : is_value V1 H3 : is_value LV ============================ newNameScopes N Len EE_A' EE_B'
< apply updateListIndex_unique to _ _ EvA5 EvB4. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N2 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N2 V1 LV3 EvA6 : replaceScopes L LV3 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV H1 : is_value VI1 H2 : is_value V1 H3 : is_value LV ============================ newNameScopes N Len EE_A' EE_B'
< NNS': assert newNameScopes N Len (Scope::EE_A) (Scope::EE_B). Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N2 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N2 V1 LV3 EvA6 : replaceScopes L LV3 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV H1 : is_value VI1 H2 : is_value V1 H3 : is_value LV NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) ============================ newNameScopes N Len EE_A' EE_B'
< apply updateListIndex_is to _ _ EvA5. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N2 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N2 V1 LV3 EvA6 : replaceScopes L LV3 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV H1 : is_value VI1 H2 : is_value V1 H3 : is_value LV NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H4 : is_value LV3 ============================ newNameScopes N Len EE_A' EE_B'
< R: apply newNameScopes_replaceScopes to _ _ _ _ NNS' EvB5. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 RA IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N2 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N2 V1 LV3 EvA6 : replaceScopes L LV3 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV H1 : is_value VI1 H2 : is_value V1 H3 : is_value LV NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H4 : is_value LV3 R : replaceScopes L LV3 (Scope::EE_A) RA R1 : newNameScopes N Len RA EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< apply replaceScopes_unique to R EvA6. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope LV O1 O2 E I L VI1 O3 N2 V1 O4 LV3 V2 V3 IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 VI1 O1 * EvA3 : matchInt VI1 N2 EvA4 : evalExpr FE (Scope::EE_A) E V1 O2 * EvA5 : updateListIndex LV N2 V1 LV3 EvA6 : replaceScopes L LV3 (Scope::EE_A) EE_A' EvA7 : O1 ++ O2 = O_A Is : is_string L Is1 : is_expr I Is2 : is_expr E EvB : lookupScopes L (Scope::EE_B) LV EvB1 : evalExpr FE (Scope::EE_B) I VI1 O3 EvB2 : matchInt VI1 N2 EvB3 : evalExpr FE (Scope::EE_B) E V1 O4 EvB4 : updateListIndex LV N2 V1 LV3 EvB5 : replaceScopes L LV3 (Scope::EE_B) EE_B' EvB6 : O3 ++ O4 = O_B VI : vars I V2 VE : vars E V3 L : lookupScopes L (Scope::EE_A) LV H1 : is_value VI1 H2 : is_value V1 H3 : is_value LV NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H4 : is_value LV3 R : replaceScopes L LV3 (Scope::EE_A) EE_A' R1 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 4.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 4.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 4.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 4.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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_V_E to _ _ _ _ EvA1 EvB V _. Subgoal 4.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 _ LSB. Subgoal 4.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 H1 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 ============================ lookupScopes X1 (Scope::EE_A) V1
< apply lookupScopes_is_key to _ LSB. Subgoal 4.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 H1 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 H2 : is_string X1 ============================ lookupScopes X1 (Scope::EE_A) V1
< apply newNameScopes_lookupScopes to _ _ _ LSB. Subgoal 4.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 H1 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 H2 : is_string X1 H3 : lookupScopes X1 (Scope::EE_A) V1 ============================ lookupScopes X1 (Scope::EE_A) V1
< search. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 Body L X LV1 O3 O4 V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O1 * EvA2 : iterateList FE (Scope::EE_A) LV1 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 evalExpr_isValue to _ _ _ EvA1. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 Body L X LV1 O3 O4 V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O1 * EvA2 : iterateList FE (Scope::EE_A) LV1 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 H1 : is_value LV1 ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_IL to _ _ _ _ _ _ EvA2 EvB1 _. Subgoal 4.16: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope O1 O2 Body L X LV1 O3 O4 V IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 O1 * EvA2 : iterateList FE (Scope::EE_A) LV1 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 H1 : is_value LV1 H2 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Subgoal 9.1: Variables: FE EE_B X Body EE_A' EE_B' O_B N Len IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.1: Variables: FE X Body EE_A' EE_B' N Len IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 9.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.1: Variables: FE EE_B X Body EE_A' EE_B' O_B N Len IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.1: Variables: FE X Body EE_A' EE_B' N Len IH_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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 10.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_V_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 IH_O_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) -> 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_V_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 IH_O_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) -> O_A = O_B IH_V_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 IH_O_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) -> 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.
< Add_Ext_Size matchEval:host:evalExpr, matchEval:host:evalArgs, matchEval:host:evalRecFields, matchEval:host:evalStmt with iterateList FE EE V X Body EE' O. Proof completed.
< Add_Proj_Rel matchEval:host:evalExpr, matchEval:host:evalArgs, matchEval:host:evalRecFields, matchEval:host:evalStmt with iterateList FE EE V X Body EE' O. Proof completed.
< Prove matchEval:host:evalExpr_rel_exists_ES, matchEval:host:evalStmt_newNameScopes_exists_ES, matchEval:host:evalArgs_rel_exists_ES, matchEval: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.32: 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.33: 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.33: 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.33: 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.33.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.33.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.33.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.33.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.33: 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.33.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.33.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.33.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.33.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.33: 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.34: 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.34: 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
< case Vars. Subgoal 1.34: 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 H2 : vars E1 Vars ============================ <evalExpr {ES}> FE EE_A (head E1) V O ES
< apply IH_E to _ _ _ _ EvB2 _ Rel. Subgoal 1.34: 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 H2 : vars E1 Vars H3 : <evalExpr {ES}> FE EE_A E1 (consVal V Tl) O N1 ============================ <evalExpr {ES}> FE EE_A (head E1) V O ES
< search. Subgoal 1.35: 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.35: 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
< case Vars. Subgoal 1.35: 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 H2 : vars E1 Vars ============================ <evalExpr {ES}> FE EE_A (tail E1) V O ES
< apply IH_E to _ _ _ _ EvB2 _ Rel. Subgoal 1.35: 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 H2 : vars E1 Vars H3 : <evalExpr {ES}> FE EE_A E1 (consVal Hd V) O N1 ============================ <evalExpr {ES}> FE EE_A (tail E1) V O ES
< search. Subgoal 1.36: 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.36: 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
< case Vars. Subgoal 1.36: 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 H2 : vars E1 Vars ============================ <evalExpr {ES}> FE EE_A (null E1) trueVal O ES
< apply IH_E to _ _ _ _ EvB2 _ Rel. Subgoal 1.36: 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 H2 : vars E1 Vars H3 : <evalExpr {ES}> FE EE_A E1 nilVal O N1 ============================ <evalExpr {ES}> FE EE_A (null E1) trueVal O ES
< search. Subgoal 1.37: 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.37: 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
< case Vars. Subgoal 1.37: 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 H2 : vars E1 Vars ============================ <evalExpr {ES}> FE EE_A (null E1) falseVal O ES
< apply IH_E to _ _ _ _ EvB2 _ Rel. Subgoal 1.37: 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 H2 : vars E1 Vars H3 : <evalExpr {ES}> FE EE_A E1 (consVal Hd Tl) O N1 ============================ <evalExpr {ES}> FE EE_A (null E1) falseVal O ES
< search. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O ============================ 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 VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O 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
< LA: apply newNameScopes_lookupScopes to IsA _ _ EvB3. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< VI: 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 VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< EvA1: apply IH_E to _ _ IsA _ EvB4 VI _ 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 VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 ============================ forall X V2, mem X V1 -> lookupScopes X (Scope::EE_B) V2 -> lookupScopes X (Scope::EE_A) V2
< intros _ LSB. Subgoal 2.15.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 V O3 LV2 E I L V1 X 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 H1 : mem X V1 LSB : lookupScopes X (Scope::EE_B) V2 ============================ lookupScopes X (Scope::EE_A) V2
< apply lookupScopes_is_key to _ LSB. Subgoal 2.15.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 V O3 LV2 E I L V1 X 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 H1 : mem X V1 LSB : lookupScopes X (Scope::EE_B) V2 H2 : is_string X ============================ lookupScopes X (Scope::EE_A) V2
< apply newNameScopes_lookupScopes to _ _ _ LSB. Subgoal 2.15.1: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 V O3 LV2 E I L V1 X 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 H1 : mem X V1 LSB : lookupScopes X (Scope::EE_B) V2 H2 : is_string X H3 : lookupScopes X (Scope::EE_A) V2 ============================ lookupScopes X (Scope::EE_A) V2
< search. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< EvB1': apply drop_ext_size_evalExpr to EvB4. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< EvA1': apply drop_ext_size_evalExpr to EvA1. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< VE: 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 VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< EvA2: apply IH_E to _ _ _ _ EvB6 VE _ 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 VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 ============================ forall X V1, mem X V2 -> lookupScopes X (Scope::EE_B) V1 -> lookupScopes X (Scope::EE_A) V1
< intros _ LSB. Subgoal 2.15.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 H1 : mem X V2 LSB : lookupScopes X (Scope::EE_B) V3 ============================ lookupScopes X (Scope::EE_A) V3
< apply lookupScopes_is_key to _ LSB. Subgoal 2.15.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 H1 : mem X V2 LSB : lookupScopes X (Scope::EE_B) V3 H2 : is_string X ============================ lookupScopes X (Scope::EE_A) V3
< apply newNameScopes_lookupScopes to _ _ _ LSB. Subgoal 2.15.2: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 H1 : mem X V2 LSB : lookupScopes X (Scope::EE_B) V3 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 VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 EvA2 : <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
< EvB2': apply drop_ext_size_evalExpr to EvB6. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 EvA2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2 EvB2' : 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
< EvA2': apply drop_ext_size_evalExpr to EvA2. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 EvA2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2 EvB2' : evalExpr FE (Scope::EE_B) E V O3 EvA2' : evalExpr FE (Scope::EE_A) E V O3 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< apply evalExpr_isValue to _ _ _ EvB2'. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 EvA2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2 EvB2' : evalExpr FE (Scope::EE_B) E V O3 EvA2' : evalExpr FE (Scope::EE_A) E V O3 H1 : 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 VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 EvA2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2 EvB2' : evalExpr FE (Scope::EE_B) E V O3 EvA2' : evalExpr FE (Scope::EE_A) E V O3 H1 : is_value V H2 : is_value LV ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< apply updateListIndex_is to _ _ EvB7. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 EvA2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2 EvB2' : evalExpr FE (Scope::EE_B) E V O3 EvA2' : evalExpr FE (Scope::EE_A) E V O3 H1 : is_value V H2 : is_value LV H3 : is_value LV2 ============================ 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 VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 EvA2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2 EvB2' : evalExpr FE (Scope::EE_B) E V O3 EvA2' : evalExpr FE (Scope::EE_A) E V O3 H1 : is_value V H2 : is_value LV H3 : is_value LV2 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
< apply newNameScopes_replaceScopes to _ _ _ _ NNS' EvB8. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N3 N2 N4 LV VI O2 N1 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 VI O2 N3 * EvB5 : matchInt VI N1 EvB6 : <evalExpr {ES}> FE (Scope::EE_B) E V O3 N2 * EvB7 : updateListIndex LV N1 V LV2 EvB8 : replaceScopes L LV2 (Scope::EE_B) EE_B' EvB9 : O2 ++ O3 = O Is : is_string L Is1 : is_expr I Is2 : is_expr E LA : lookupScopes L (Scope::EE_A) LV VI : vars I V1 EvA1 : <evalExpr {ES}> FE (Scope::EE_A) I VI O2 N3 EvB1' : evalExpr FE (Scope::EE_B) I VI O2 EvA1' : evalExpr FE (Scope::EE_A) I VI O2 VE : vars E V2 EvA2 : <evalExpr {ES}> FE (Scope::EE_A) E V O3 N2 EvB2' : evalExpr FE (Scope::EE_B) E V O3 EvA2' : evalExpr FE (Scope::EE_A) E V O3 H1 : is_value V H2 : is_value LV H3 : is_value LV2 NNS' : newNameScopes N Len (Scope::EE_A) (Scope::EE_B) H4 : replaceScopes L LV2 (Scope::EE_A) RA H5 : newNameScopes N Len RA EE_B' ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (listUpdate L I E) EE_A' O ES
< search. Subgoal 2.16: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 N3 N4 LV 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 _ 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 H2 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 ============================ lookupScopes X1 (Scope::EE_A) V1
< apply lookupScopes_is_key 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 H2 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 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 H2 : mem X1 V LSB : lookupScopes X1 (Scope::EE_B) V1 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 matchEval:host:evalExpr_scopes_same, matchEval:host:evalStmt_scopes_same, matchEval:host:evalStmt_scopes_same_ctx, matchEval:host:evalArgs_scopes_same, matchEval: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.32: 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.32: 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.33: 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.33: 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.33: 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 _ _ _ _ _ EvA1 EvB. Subgoal 1.33: 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.33: 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.33: 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.34: 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.34: 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.34: 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 _ _ _ _ _ EvA1 EvB. Subgoal 1.34: 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.35: 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.35: 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.35: 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 _ _ _ _ _ EvA1 EvB. Subgoal 1.35: 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.36: 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.36: 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.36.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 _ _ _ _ _ EvA1 EvB. Subgoal 1.36.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.36.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 _ _ _ _ _ EvA1 EvB. Subgoal 1.37: 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.37: 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.37.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 _ _ _ _ _ EvA1 EvB. Subgoal 1.37.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 _ _ _ _ _ EvA1 EvB. Subgoal 1.37.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 2.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV VI O1 N 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 VI O1 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O2 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : O1 ++ O2 = OA ============================ OA = OB
< case IsS. Subgoal 2.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV VI O1 N 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 VI O1 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O2 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI O1 N V O2 LV2 E I L LV1 VI1 O3 N1 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 VI O1 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O2 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA2 EvB1. Subgoal 2.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV N V O2 LV2 E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N EvA4 : evalExpr FE EE_A E V O2 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : 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 N V O2 LV2 E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N EvA4 : evalExpr FE EE_A E V O2 * EvA5 : updateListIndex LV1 N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB ============================ OA = OB
< apply IH_E to _ _ _ _ _ EvA4 EvB3. Subgoal 2.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N LV2 E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N EvA4 : evalExpr FE EE_A E V1 O4 * EvA5 : updateListIndex LV1 N V1 LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB ============================ OA = OB
< apply append_unique to EvA7 EvB6. Subgoal 2.15: Variables: FE EE_A EE_A' EE_B EE_B' OB N LV2 E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N EvA4 : evalExpr FE EE_A E V1 O4 * EvA5 : updateListIndex LV1 N V1 LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : 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 VI O1 N 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 VI O1 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O2 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : O1 ++ O2 = OA ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV VI O1 N 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 VI O1 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O2 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : O1 ++ O2 = OA H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV VI O1 N V O2 LV2 E I L LV1 VI1 O3 N1 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 VI O1 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O2 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB ============================ 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 N V O2 LV2 E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N EvA4 : evalExpr FE EE_A E V O2 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply IH_E to _ _ _ _ _ EvA4 EvB3. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV N LV2 E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N EvA4 : evalExpr FE EE_A E V1 O4 * EvA5 : updateListIndex LV N V1 LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply scopes_same_lookupScopes to _ _ SS EvA1 EvB. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N LV2 E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N EvA4 : evalExpr FE EE_A E V1 O4 * EvA5 : updateListIndex LV1 N V1 LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isValue to _ _ _ EvA2. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB N LV2 E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N EvA4 : evalExpr FE EE_A E V1 O4 * EvA5 : updateListIndex LV1 N V1 LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB H4 : is_value VI1 ============================ scopes_same EE_A' EE_B'
< apply matchInt_unique to _ EvA3 EvB2. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV2 E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE EE_A E V1 O4 * EvA5 : updateListIndex LV1 N1 V1 LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB H4 : is_value VI1 ============================ scopes_same EE_A' EE_B'
< apply evalExpr_isValue to _ _ _ EvA4. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV2 E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE EE_A E V1 O4 * EvA5 : updateListIndex LV1 N1 V1 LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB H4 : is_value VI1 H5 : is_value V1 ============================ scopes_same EE_A' EE_B'
< apply lookupScopes_is to _ EvA1. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB LV2 E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE EE_A E V1 O4 * EvA5 : updateListIndex LV1 N1 V1 LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB H4 : is_value VI1 H5 : is_value V1 H6 : is_value LV1 ============================ scopes_same EE_A' EE_B'
< apply updateListIndex_unique to _ _ EvA5 EvB4. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE EE_A E V1 O4 * EvA5 : updateListIndex LV1 N1 V1 LV3 EvA6 : replaceScopes L LV3 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB H4 : is_value VI1 H5 : is_value V1 H6 : is_value LV1 ============================ scopes_same EE_A' EE_B'
< apply scopes_same_replaceScopes_scopes_same to _ _ _ _ EvA6 EvB5. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB E I L LV1 VI1 O3 N1 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 VI1 O3 * EvA3 : matchInt VI1 N1 EvA4 : evalExpr FE EE_A E V1 O4 * EvA5 : updateListIndex LV1 N1 V1 LV3 EvA6 : replaceScopes L LV3 EE_A EE_A' EvA7 : 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 VI1 O3 EvB2 : matchInt VI1 N1 EvB3 : evalExpr FE EE_B E V1 O4 EvB4 : updateListIndex LV1 N1 V1 LV3 EvB5 : replaceScopes L LV3 EE_B EE_B' EvB6 : O3 ++ O4 = OB H4 : is_value VI1 H5 : is_value V1 H6 : is_value LV1 H7 : 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 matchEval:host:evalExpr_scopes_same_exists, matchEval:host:evalStmt_scopes_same_exists, matchEval:host:evalArgs_scopes_same_exists, matchEval: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.32: 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.33: 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.33: 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
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.33: 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 EvB1 : evalExpr FE EE_B E1 V1 O2 ============================ evalExpr FE EE_B (cons E1 E2) (consVal V1 V2) O
< EvB2: apply IH_E to _ _ _ _ SS EvA2. Subgoal 1.33: 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 EvB1 : evalExpr FE EE_B E1 V1 O2 EvB2 : evalExpr FE EE_B E2 V2 O3 ============================ evalExpr FE EE_B (cons E1 E2) (consVal V1 V2) O
< search. Subgoal 1.34: 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.34: 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
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.34: 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 EvB1 : evalExpr FE EE_B E1 (consVal V Tl) O ============================ evalExpr FE EE_B (head E1) V O
< search. Subgoal 1.35: 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.35: 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
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.35: 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 EvB1 : evalExpr FE EE_B E1 (consVal Hd V) O ============================ evalExpr FE EE_B (tail E1) V O
< search. Subgoal 1.36: 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.36: 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
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.36: 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 EvB1 : evalExpr FE EE_B E1 nilVal O ============================ evalExpr FE EE_B (null E1) trueVal O
< search. Subgoal 1.37: 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.37: 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
< EvB1: apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.37: 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 EvB1 : evalExpr FE EE_B E1 (consVal Hd Tl) O ============================ evalExpr FE EE_B (null E1) falseVal O
< search. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B LV VI O2 N 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 VI O2 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O3 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : 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 VI O2 N 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 VI O2 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O3 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< EvB1: apply IH_E to _ _ _ _ SS EvA2. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B LV VI O2 N 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 VI O2 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O3 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I VI O2 ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< EvB2: apply IH_E to _ _ _ _ SS EvA4. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B LV VI O2 N 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 VI O2 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O3 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I VI O2 EvB2 : evalExpr FE EE_B E V O3 ============================ exists EE_B', evalStmt FE EE_B (listUpdate L I E) EE_B' O
< apply scopes_same_lookupScopes_exists to _ _ SS EvA1. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B LV VI O2 N 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 VI O2 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O3 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I VI O2 EvB2 : evalExpr FE EE_B E V O3 H4 : 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 EvA6. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B LV VI O2 N 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 VI O2 * EvA3 : matchInt VI N EvA4 : evalExpr FE EE_A E V O3 * EvA5 : updateListIndex LV N V LV2 EvA6 : replaceScopes L LV2 EE_A EE_A' EvA7 : O2 ++ O3 = O H1 : is_string L H2 : is_expr I H3 : is_expr E EvB1 : evalExpr FE EE_B I VI O2 EvB2 : evalExpr FE EE_B E V O3 H4 : lookupScopes L EE_B LV H5 : 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 is_list_values_append_nil : forall L, is_list is_value L -> L ++ [] = L. ============================ forall L, is_list is_value L -> L ++ [] = L
< induction on 1. IH : forall L, is_list is_value L * -> L ++ [] = L ============================ forall L, is_list is_value L @ -> L ++ [] = L
< intros IsL. Variables: L IH : forall L, is_list is_value L * -> L ++ [] = L IsL : is_list is_value L @ ============================ L ++ [] = L
< Is: case IsL. Subgoal 1: IH : forall L, is_list is_value L * -> L ++ [] = L ============================ [] ++ [] = []
< search. Subgoal 2: Variables: T H IH : forall L, is_list is_value L * -> L ++ [] = L Is : is_value H Is1 : is_list is_value T * ============================ H::T ++ [] = H::T
< apply IH to Is1. Subgoal 2: Variables: T H IH : forall L, is_list is_value L * -> L ++ [] = L Is : is_value H Is1 : is_list is_value T * H1 : T ++ [] = T ============================ H::T ++ [] = H::T
< search. Proof completed.
< Prove_Constraint matchEval:host:proj_matchInt. Subgoal 1: Variables: I Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal MI : matchInt (recVal [("null", trueVal)]) I ============================ matchInt nilVal I
< case MI. Subgoal 2: Variables: I V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) MI : matchInt (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) I ============================ matchInt (consVal V1 V2) I
< case MI. Proof completed.
< Prove_Constraint matchEval:host:proj_matchTrue. Subgoal 1: Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal MT : matchTrue (recVal [("null", trueVal)]) ============================ matchTrue nilVal
< case MT. Subgoal 2: Variables: V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) MT : matchTrue (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) ============================ matchTrue (consVal V1 V2)
< case MT. Proof completed.
< Prove_Constraint matchEval:host:proj_matchFalse. Subgoal 1: Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal MF : matchFalse (recVal [("null", trueVal)]) ============================ matchFalse nilVal
< case MF. Subgoal 2: Variables: V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) MF : matchFalse (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) ============================ matchFalse (consVal V1 V2)
< case MF. Proof completed.
< Prove_Constraint matchEval:host:proj_matchString. Subgoal 1: Variables: S Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal MS : matchString (recVal [("null", trueVal)]) S ============================ matchString nilVal S
< case MS. Subgoal 2: Variables: S V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) MS : matchString (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) S ============================ matchString (consVal V1 V2) S
< case MS. Proof completed.
< Prove_Constraint matchEval:host:proj_matchRec. Subgoal 1: Variables: Fs Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal MR : matchRec (recVal [("null", trueVal)]) Fs ============================ matchRec nilVal Fs
< MR: case MR. Subgoal 1: Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal ============================ matchRec nilVal [("null", trueVal)]
< search. Subgoal 2: Variables: Fs V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) MR : matchRec (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) Fs ============================ matchRec (consVal V1 V2) Fs
< MR: case MR. Subgoal 2: Variables: V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) ============================ matchRec (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)]
< search. Proof completed.
< Add_Proj_Rel matchEval:host:matchInt. Proof completed.
< Prove_Ext_Ind matchEval:host:matchInt. Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size Proof completed.
< Add_Proj_Rel matchEval:host:matchTrue. Proof completed.
< Prove_Ext_Ind matchEval:host:matchTrue. Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size Proof completed.
< Add_Proj_Rel matchEval:host:matchFalse. Proof completed.
< Prove_Ext_Ind matchEval:host:matchFalse. Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size Proof completed.
< Add_Proj_Rel matchEval:host:matchRec. Proof completed.
< Prove_Ext_Ind matchEval:host:matchRec. Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size Subgoal 2: IH : forall V Fs, matchRec V Fs * -> is_value V -> <matchRec {P}> V Fs R : matchRec nilVal [("null", trueVal)] @ IsV : is_value nilVal ============================ <matchRec {P}> nilVal [("null", trueVal)]
< search. Subgoal 3: Variables: V2 V1 IH : forall V Fs, matchRec V Fs * -> is_value V -> <matchRec {P}> V Fs R : matchRec (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)] @ IsV : is_value (consVal V1 V2) ============================ <matchRec {P}> (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)]
< case IsV. Subgoal 3: Variables: V2 V1 IH : forall V Fs, matchRec V Fs * -> is_value V -> <matchRec {P}> V Fs R : matchRec (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)] @ H1 : is_value V1 H2 : is_value V2 ============================ <matchRec {P}> (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)]
< search. Proof completed.
< Add_Proj_Rel matchEval:host:matchString. Proof completed.
< Prove_Ext_Ind matchEval:host:matchString. Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size Proof completed.
< Prove matchEval:host:projedVal_is. Proof completed.
< Prove matchEval:host:projedVal_matchInt. Proof completed.
< Prove matchEval:host:projedVal_matchString. Proof completed.
< Prove matchEval:host:projedVal_matchTrue. Proof completed.
< Prove matchEval:host:projedVal_matchFalse. Proof completed.
< Prove matchEval:host:projedVal_matchRec. Proof completed.
< Prove_Constraint matchEval:host:matchInt_proj. Subgoal 1: Variables: I Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal MI : matchInt nilVal I ============================ matchInt (recVal [("null", trueVal)]) I
< case MI. Subgoal 2: Variables: I V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) MI : matchInt (consVal V1 V2) I ============================ matchInt (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) I
< case MI. Proof completed.
< Prove_Constraint matchEval:host:matchTrue_proj. Subgoal 1: Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal MT : matchTrue nilVal ============================ matchTrue (recVal [("null", trueVal)])
< case MT. Subgoal 2: Variables: V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) MT : matchTrue (consVal V1 V2) ============================ matchTrue (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
< case MT. Proof completed.
< Prove_Constraint matchEval:host:matchFalse_proj. Subgoal 1: Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal MF : matchFalse nilVal ============================ matchFalse (recVal [("null", trueVal)])
< case MF. Subgoal 2: Variables: V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) MF : matchFalse (consVal V1 V2) ============================ matchFalse (recVal [("null", falseVal), ("head", V1), ("tail", V2)])
< case MF. Proof completed.
< Prove_Constraint matchEval:host:matchString_proj. Subgoal 1: Variables: S Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal MS : matchString nilVal S ============================ matchString (recVal [("null", trueVal)]) S
< case MS. Subgoal 2: Variables: S V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) MS : matchString (consVal V1 V2) S ============================ matchString (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) S
< case MS. Proof completed.
< Prove_Constraint matchEval:host:matchRec_proj. Subgoal 1: Variables: Fs Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal MR : matchRec nilVal Fs ============================ matchRec (recVal [("null", trueVal)]) Fs
< MR: case MR. Subgoal 1: Pr : |{value}- nilVal ~~> recVal [("null", trueVal)] IsV : is_value nilVal ============================ matchRec (recVal [("null", trueVal)]) [("null", trueVal)]
< search. Subgoal 2: Variables: Fs V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) MR : matchRec (consVal V1 V2) Fs ============================ matchRec (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) Fs
< MR: case MR. Subgoal 2: Variables: V2 V1 Pr : |{value}- consVal V1 V2 ~~> recVal [("null", falseVal), ("head", V1), ("tail", V2)] IsV : is_value (consVal V1 V2) ============================ matchRec (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) [("null", falseVal), ("head", V1), ("tail", V2)]
< search. Proof completed.
< Prove matchEval:host:matchInt_projedVal. Proof completed.
< Prove matchEval:host:matchTrue_projedVal. Proof completed.
< Prove matchEval:host:matchFalse_projedVal. Proof completed.
< Prove matchEval:host:matchString_projedVal. Proof completed.
< Prove matchEval:host:matchRec_projedVal. Proof completed.
< Theorem projedFields_lookup_back : forall Fs Fs' X V', projedFields Fs Fs' -> lookup Fs' X V' -> exists V, lookup Fs X V /\ projedVal V V'. ============================ forall Fs Fs' X V', projedFields Fs Fs' -> lookup Fs' X V' -> exists V, lookup Fs X V /\ projedVal V V'
< induction on 2. IH : forall Fs Fs' X V', projedFields Fs Fs' -> lookup Fs' X V' * -> exists V, lookup Fs X V /\ projedVal V V' ============================ forall Fs Fs' X V', projedFields Fs Fs' -> lookup Fs' X V' @ -> exists V, lookup Fs X V /\ projedVal V V'
< intros PF L. Variables: Fs Fs' X V' IH : forall Fs Fs' X V', projedFields Fs Fs' -> lookup Fs' X V' * -> exists V, lookup Fs X V /\ projedVal V V' PF : projedFields Fs Fs' L : lookup Fs' X V' @ ============================ exists V, lookup Fs X V /\ projedVal V V'
< L: case L. Subgoal 1: Variables: Fs X V' Rest IH : forall Fs Fs' X V', projedFields Fs Fs' -> lookup Fs' X V' * -> exists V, lookup Fs X V /\ projedVal V V' PF : projedFields Fs ((X, V')::Rest) ============================ exists V, lookup Fs X V /\ projedVal V V'
< case PF. Subgoal 1: Variables: X V' Rest ARest VA IH : forall Fs Fs' X V', projedFields Fs Fs' -> lookup Fs' X V' * -> exists V, lookup Fs X V /\ projedVal V V' H1 : projedVal VA V' H2 : projedFields ARest Rest ============================ exists V, lookup ((X, VA)::ARest) X V /\ projedVal V V'
< search. Subgoal 2: Variables: Fs X V' Rest V K IH : forall Fs Fs' X V', projedFields Fs Fs' -> lookup Fs' X V' * -> exists V, lookup Fs X V /\ projedVal V V' PF : projedFields Fs ((K, V)::Rest) L : K = X -> false L1 : lookup Rest X V' * ============================ exists V, lookup Fs X V /\ projedVal V V'
< PF: case PF. Subgoal 2: Variables: X V' Rest V K ARest VA IH : forall Fs Fs' X V', projedFields Fs Fs' -> lookup Fs' X V' * -> exists V, lookup Fs X V /\ projedVal V V' L : K = X -> false L1 : lookup Rest X V' * PF : projedVal VA V PF1 : projedFields ARest Rest ============================ exists V, lookup ((K, VA)::ARest) X V /\ projedVal V V'
< apply IH to PF1 L1. Subgoal 2: Variables: X V' Rest V K ARest VA V1 IH : forall Fs Fs' X V', projedFields Fs Fs' -> lookup Fs' X V' * -> exists V, lookup Fs X V /\ projedVal V V' L : K = X -> false L1 : lookup Rest X V' * PF : projedVal VA V PF1 : projedFields ARest Rest H1 : lookup ARest X V1 H2 : projedVal V1 V' ============================ exists V, lookup ((K, VA)::ARest) X V /\ projedVal V V'
< search. Proof completed.
< Prove_Constraint matchEval:host:proj_evalExpr_forward. Subgoal 1: Variables: FE EE V O Ty Pr : |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) 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 (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) V' O /\ projedVal V V'
< case Ev. Subgoal 1: Variables: FE EE Ty Pr : |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) 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 (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) V' [] /\ projedVal nilVal V'
< apply scopes_same_reflexive to IsEE. Subgoal 1: Variables: FE EE Ty Pr : |{expr}- nil Ty ~~> recBuild (consRecFieldExprs "null" true nilRecFieldExprs) IsE : is_expr (nil Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : scopes_same EE EE ============================ exists V', evalExpr FE EE (recBuild (consRecFieldExprs "null" true nilRecFieldExprs)) V' [] /\ projedVal nilVal V'
< search. Subgoal 2: Variables: FE EE V O E2 E1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) 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 (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) V' O /\ projedVal V V'
< Ev: case Ev. Subgoal 2: Variables: FE EE O E2 E1 O2 O3 V2 V1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsE : is_expr (cons E1 E2) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 O2 Ev1 : evalExpr FE EE E2 V2 O3 Ev2 : O2 ++ O3 = O ============================ exists V', evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) V' O /\ projedVal (consVal V1 V2) V'
< case IsE. Subgoal 2: Variables: FE EE O E2 E1 O2 O3 V2 V1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 O2 Ev1 : evalExpr FE EE E2 V2 O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 ============================ exists V', evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) V' O /\ projedVal (consVal V1 V2) V'
< IsO3: apply evalExpr_isOutput to _ _ _ Ev1. Subgoal 2: Variables: FE EE O E2 E1 O2 O3 V2 V1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 O2 Ev1 : evalExpr FE EE E2 V2 O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsO3 : is_list is_value O3 ============================ exists V', evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) V' O /\ projedVal (consVal V1 V2) V'
< apply is_list_values_append_nil to IsO3. Subgoal 2: Variables: FE EE O E2 E1 O2 O3 V2 V1 Pr : |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 V1 O2 Ev1 : evalExpr FE EE E2 V2 O3 Ev2 : O2 ++ O3 = O H1 : is_expr E1 H2 : is_expr E2 IsO3 : is_list is_value O3 H3 : O3 ++ [] = O3 ============================ exists V', evalExpr FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) V' O /\ projedVal (consVal V1 V2) V'
< search. Subgoal 3: Variables: FE EE V O E1 Pr : |{expr}- null E1 ~~> recFieldAccess E1 "null" IsE : is_expr (null E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V O ============================ exists V', evalExpr FE EE (recFieldAccess E1 "null") V' O /\ projedVal V V'
< case IsE. Subgoal 3: Variables: FE EE V O E1 Pr : |{expr}- null E1 ~~> recFieldAccess E1 "null" IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (null E1) V O H1 : is_expr E1 ============================ exists V', evalExpr FE EE (recFieldAccess E1 "null") V' O /\ projedVal V V'
< Ev: case Ev. Subgoal 3.1: Variables: FE EE O E1 Pr : |{expr}- null E1 ~~> recFieldAccess E1 "null" IsFE : is_list (is_pair is_string (is_pair is_string (is_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 Ev : evalExpr FE EE E1 nilVal O ============================ exists V', evalExpr FE EE (recFieldAccess E1 "null") V' O /\ projedVal trueVal V'
< search. Subgoal 3.2: Variables: FE EE O E1 Hd Tl Pr : |{expr}- null E1 ~~> recFieldAccess E1 "null" IsFE : is_list (is_pair is_string (is_pair is_string (is_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 Ev : evalExpr FE EE E1 (consVal Hd Tl) O ============================ exists V', evalExpr FE EE (recFieldAccess E1 "null") V' O /\ projedVal falseVal V'
< search. Subgoal 4: Variables: FE EE V O E1 Pr : |{expr}- head E1 ~~> recFieldAccess E1 "head" 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 ============================ exists V', evalExpr FE EE (recFieldAccess E1 "head") V' O /\ projedVal V V'
< Ev: case Ev. Subgoal 4: Variables: FE EE V O E1 Tl Pr : |{expr}- head E1 ~~> recFieldAccess E1 "head" IsE : is_expr (head E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (consVal V Tl) O ============================ exists V', evalExpr FE EE (recFieldAccess E1 "head") V' O /\ projedVal V V'
< search. Subgoal 5: Variables: FE EE V O E1 Pr : |{expr}- tail E1 ~~> recFieldAccess E1 "tail" 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 ============================ exists V', evalExpr FE EE (recFieldAccess E1 "tail") V' O /\ projedVal V V'
< Ev: case Ev. Subgoal 5: Variables: FE EE V O E1 Hd Pr : |{expr}- tail E1 ~~> recFieldAccess E1 "tail" IsE : is_expr (tail E1) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE E1 (consVal Hd V) O ============================ exists V', evalExpr FE EE (recFieldAccess E1 "tail") V' O /\ projedVal V V'
< 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 V O1 Scope EE1 O2 O3 O12, evalExpr FE ([(F, consVal Hd Tl)]::EE) (not (null (name F))) V O1 /\ (matchTrue V /\ (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 trueVal, [], 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 [] /\ (matchTrue 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 ============================ matchTrue trueVal
< 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, 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.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 ============================ 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.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, 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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.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 ============================ 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.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 = O2
< search. Subgoal 2.8: 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 VI, listy HoldL -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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 VI, listy HoldL -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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 VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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 VI, listy HoldL @ -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G') [] /\ replaceScopes L LV G G') /\ flipOnto (consVal H HoldL) LVal LV
< intros ListyH IsFE IsCtx M0 NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL LS. Variables: Hold SaveI SaveE L V H HoldL LVal G FE VI IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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 VI IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G') [] /\ replaceScopes L LV G G') /\ flipOnto (consVal H nilVal) LVal LV
< EvCondA: assert <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []. Subgoal 1.1: Variables: Hold SaveI SaveE L V H LVal G FE VI IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ============================ <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
< search 20. Subgoal 1: Variables: Hold SaveI SaveE L V H LVal G FE VI IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'. Subgoal 1.2: Variables: Hold SaveI SaveE L V H LVal G FE VI IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G)). Subgoal 1.2: Variables: Hold SaveI SaveE L V H LVal G FE VI IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (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 VI IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< LS: assert lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal. Subgoal 1.2: Variables: Hold SaveI SaveE L V H LVal G FE VI IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< apply lookupScopes_is_key to _ LS. Subgoal 1.2: Variables: Hold SaveI SaveE L V H LVal G FE VI IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal H1 : is_string L ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (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 VI R IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G) R ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< RS: case RS (keep). Subgoal 1.2.1: Variables: Hold SaveI SaveE L V H LVal G FE VI I LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G) RS1 : mem (L, I) [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] L LRemain ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< M: case RS1. Subgoal 1.2.1.1: Variables: Hold SaveI SaveE V H LVal G FE VI LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal LS1 : lookupScopes Hold ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal H1 : is_string Hold RS : replaceScopes Hold (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G) (((Hold, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] Hold LRemain ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign Hold (cons (head (name Hold)) (name Hold))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes Hold (consVal H LVal) G G'
< apply NEqHL to _. Subgoal 1.2.1.2: Variables: Hold SaveI SaveE L V H LVal G FE VI I LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] L LRemain M : mem (L, I) [(SaveI, VI), (SaveE, V)] ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< M: case M. Subgoal 1.2.1.2.1: Variables: Hold SaveI SaveE V H LVal G FE VI LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal LS1 : lookupScopes SaveI ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal H1 : is_string SaveI RS : replaceScopes SaveI (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G) (((SaveI, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] SaveI LRemain ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (cons (head (name Hold)) (name SaveI))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes SaveI (consVal H LVal) G G'
< apply NEqIL to _. Subgoal 1.2.1.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI I LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] L LRemain M : mem (L, I) [(SaveE, V)] ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< M: case M. Subgoal 1.2.1.2.2.1: Variables: Hold SaveI SaveE V H LVal G FE VI LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal LS1 : lookupScopes SaveE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal H1 : is_string SaveE RS : replaceScopes SaveE (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G) (((SaveE, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] SaveE LRemain ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign SaveE (cons (head (name Hold)) (name SaveE))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes SaveE (consVal H LVal) G G'
< apply NEqEL to _. Subgoal 1.2.1.2.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI I LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] L LRemain M : mem (L, I) [] ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< case M. Subgoal 1.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI New IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] Is+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) IsL : is_value LVal LS1 : lookupScopes L ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G) ([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] L RS2 : replaceScopes L (consVal H LVal) G New ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< search 20. Subgoal 1: Variables: Hold SaveI SaveE L V H LVal G FE VI IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G' ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, VI), (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, VI), (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 VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G') [] /\ replaceScopes L LV G G') /\ flipOnto (consVal H nilVal) LVal LV
< EvBody1B: assert <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G')) []. Subgoal 1.3: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G')) []
< unfold . Subgoal 1.3: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ exists V1, <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) (tail (name Hold)) V1 [] /\ replaceScopes Hold V1 ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G'))
< exists nilVal. Subgoal 1.3: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) (tail (name Hold)) nilVal [] /\ replaceScopes Hold nilVal ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G'))
< split. Subgoal 1.3.1: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) (tail (name Hold)) nilVal []
< search 20. Subgoal 1.3.2: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ replaceScopes Hold nilVal ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G'))
< unfold . Subgoal 1.3.2.1: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (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 VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ replaceScopes Hold nilVal ([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G') ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G')
< unfold . Subgoal 1.3.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ exists I, mem (Hold, I) [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] /\ remove_all [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] Hold [(SaveI, VI), (SaveE, V)]
< exists consVal H nilVal. Subgoal 1.3.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ mem (Hold, consVal H nilVal) [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] /\ remove_all [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] Hold [(SaveI, VI), (SaveE, V)]
< split. Subgoal 1.3.2.2.1: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ mem (Hold, consVal H nilVal) [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]
< search. Subgoal 1.3.2.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ remove_all [(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)] Hold [(SaveI, VI), (SaveE, V)]
< unfold . Subgoal 1.3.2.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ remove_all [(SaveI, VI), (SaveE, V)] Hold [(SaveI, VI), (SaveE, V)]
< unfold . Subgoal 1.3.2.2.2.1: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (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 VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (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 VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (Hold, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (Hold, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (Hold, VI), (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 VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (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 VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (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 VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (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 VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (Hold, V)]::G) M0 : matchInt VI 0 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, VI), (Hold, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (Hold, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (Hold, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (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 VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (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 VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G')) [] ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G') [] /\ replaceScopes L LV G G') /\ flipOnto (consVal H nilVal) LVal LV
< EvCondB: assert <evalExpr {P}> FE ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G')) (not (null (name Hold))) falseVal []. Subgoal 1.4: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G')) [] ============================ <evalExpr {P}> FE ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G')) (not (null (name Hold))) falseVal []
< search 20. Subgoal 1: Variables: Hold SaveI SaveE L V H LVal G FE VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvCondB : <evalExpr {P}> FE ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G')) (not (null (name Hold))) falseVal [] ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, VI), (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, VI), (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 VI G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H nilVal), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G')) [] EvCondB : <evalExpr {P}> FE ([]::([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G')) (not (null (name Hold))) falseVal [] ============================ (<evalStmt {P}> FE ([(Hold, consVal H nilVal), (SaveI, VI), (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, VI), (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 VI Tl Hd IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []. Subgoal 2.1: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * ============================ <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal []
< search 20. Subgoal 2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'. Subgoal 2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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 VI Tl Hd IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] IsL : is_value LVal ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< apply lookupScopes_is_key to _ LS. Subgoal 2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] IsL : is_value LVal H1 : is_string L ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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 VI Tl Hd R IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] IsL : is_value LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G) R ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< RS: case RS (keep). Subgoal 2.2.1: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd I LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] IsL : is_value LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G) RS1 : mem (L, I) [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] L LRemain ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< M: case RS1. Subgoal 2.2.1.1: Variables: Hold SaveI SaveE V H LVal G FE VI Tl Hd LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] IsL : is_value LVal H1 : is_string Hold RS : replaceScopes Hold (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G) (((Hold, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] Hold LRemain ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign Hold (cons (head (name Hold)) (name Hold))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes Hold (consVal H LVal) G G'
< apply NEqHL to _. Subgoal 2.2.1.2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd I LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] IsL : is_value LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] L LRemain M : mem (L, I) [(SaveI, VI), (SaveE, V)] ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< M: case M. Subgoal 2.2.1.2.1: Variables: Hold SaveI SaveE V H LVal G FE VI Tl Hd LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] IsL : is_value LVal H1 : is_string SaveI RS : replaceScopes SaveI (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G) (((SaveI, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] SaveI LRemain ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (cons (head (name Hold)) (name SaveI))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes SaveI (consVal H LVal) G G'
< apply NEqIL to _. Subgoal 2.2.1.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd I LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] IsL : is_value LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] L LRemain M : mem (L, I) [(SaveE, V)] ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< M: case M. Subgoal 2.2.1.2.2.1: Variables: Hold SaveI SaveE V H LVal G FE VI Tl Hd LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] IsL : is_value LVal H1 : is_string SaveE RS : replaceScopes SaveE (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G) (((SaveE, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] SaveE LRemain ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign SaveE (cons (head (name Hold)) (name SaveE))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes SaveE (consVal H LVal) G G'
< apply NEqEL to _. Subgoal 2.2.1.2.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd I LRemain IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] IsL : is_value LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G) (((L, consVal H LVal)::LRemain)::G) RS2 : remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] L LRemain M : mem (L, I) [] ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< case M. Subgoal 2.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd New IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] IsL : is_value LVal H1 : is_string L RS : replaceScopes L (consVal H LVal) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] L RS2 : replaceScopes L (consVal H LVal) G New ============================ exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G'
< search 20. Subgoal 2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : exists G', <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] /\ replaceScopes L (consVal H LVal) G G' ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) []. Subgoal 2.3: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) []
< unfold . Subgoal 2.3: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ exists V1, <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (tail (name Hold)) V1 [] /\ replaceScopes Hold V1 ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G'))
< exists consVal Hd Tl. Subgoal 2.3: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (tail (name Hold)) (consVal Hd Tl) [] /\ replaceScopes Hold (consVal Hd Tl) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G'))
< split. Subgoal 2.3.1: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (tail (name Hold)) (consVal Hd Tl) []
< search 20. Subgoal 2.3.2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ replaceScopes Hold (consVal Hd Tl) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G'))
< unfold . Subgoal 2.3.2.1: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ replaceScopes Hold (consVal Hd Tl) ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G') ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')
< unfold . Subgoal 2.3.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ exists I, mem (Hold, I) [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] /\ remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] Hold [(SaveI, VI), (SaveE, V)]
< exists consVal H (consVal Hd Tl). Subgoal 2.3.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (SaveE, V)] /\ remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] Hold [(SaveI, VI), (SaveE, V)]
< split. Subgoal 2.3.2.2.1: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (SaveE, V)]
< search. Subgoal 2.3.2.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ remove_all [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)] Hold [(SaveI, VI), (SaveE, V)]
< unfold . Subgoal 2.3.2.2.2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' ============================ remove_all [(SaveI, VI), (SaveE, V)] Hold [(SaveI, VI), (SaveE, V)]
< unfold . Subgoal 2.3.2.2.2.1: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (Hold, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (Hold, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (Hold, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (Hold, V)]::G) M0 : matchInt VI 0 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, VI), (Hold, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (Hold, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (Hold, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G') (consVal H LVal). Subgoal 2.4: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] ============================ lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] H1 : lookupScopes L G' (consVal H LVal) ============================ lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal)
< search. Subgoal 2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal Is : is_list (is_pair is_string is_value) [(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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, VI), (SaveE, V)] ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, VI), (SaveE, V)] 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, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, VI), (SaveE, V)] 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, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, VI), (SaveE, V)] 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, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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, VI) Is6 : is_list (is_pair is_string is_value) [(SaveE, V)] ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI 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, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI 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, VI), (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, VI), (SaveE, V)]::G') [] /\ replaceScopes L LV G G') /\ flipOnto (consVal H (consVal Hd Tl)) LVal LV
< apply lookupScopes_is_key to _ LS. Subgoal 2: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] IsG'+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (SaveE, V)]::G') ============================ exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (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, VI), (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 VI Tl Hd G' G'1 LV IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (SaveE, V)]::G') EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (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, VI), (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, VI), (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 VI Tl Hd G' G'1 LV IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (SaveE, V)]::G') EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (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, VI), (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, VI), (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 VI Tl Hd G' G'1 LV IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (SaveE, V)]::G') EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (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, VI), (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, VI), (SaveE, V)]::G'1) []
< search 20. Subgoal 2.6: Variables: Hold SaveI SaveE L V H LVal G FE VI Tl Hd G' G'1 LV IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (SaveE, V)]::G') EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (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 VI Tl Hd G' G'1 LV IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (SaveE, V)]::G') EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (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 VI Tl Hd G' G'1 LV IH : forall Hold SaveI SaveE L V H HoldL LVal G FE VI, listy HoldL * -> is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) -> matchInt VI 0 -> (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, VI), (SaveE, V)]::G) LVal -> exists G' LV, (<evalStmt {P}> FE ([(Hold, consVal H HoldL), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) M0 : matchInt VI 0 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, VI), (SaveE, V)]::G) LVal ListyH : listy Tl * EvCondA : <evalExpr {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (not (null (name Hold))) trueVal [] EvBody1A : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] EvBody1A1 : replaceScopes L (consVal H LVal) G G' EvBody1B : <evalStmt {P}> FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G')) [] LS' : lookupScopes L ([(Hold, consVal Hd Tl), (SaveI, VI), (SaveE, V)]::G') (consVal H LVal) H1 : is_value LVal 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 VI Is8 : is_list (is_pair is_string is_value) [] Is6 : is_string SaveE Is9 : is_value V H2 : is_string L EvBody1A' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G)) (assign L (cons (head (name Hold)) (name L))) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) [] H3 : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) EvBody1B' : evalStmt FE ([]::([(Hold, consVal H (consVal Hd Tl)), (SaveI, VI), (SaveE, V)]::G')) (assign Hold (tail (name Hold))) ([]::([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (SaveE, V)]::G') EvB : <evalStmt {P}> FE ([(Hold, consVal Hd Tl), (SaveI, VI), (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, VI), (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 VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV. ============================ forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV ============================ forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV
< intros ULI NEqHI NEqHL NEqIE NEqIL NEqHE NEqEL ListyH MI GEqI0 IsFE Is+ LS. Variables: OldL I V NewL Hold HoldL SaveI SaveE G FE L VI IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV
< ULI: case ULI. Subgoal 1: Variables: V Hold HoldL SaveI SaveE G FE L VI Tl VOld IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL (consVal V Tl) LV
< EvLoop1: assert <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) []. Subgoal 1.1: Variables: V Hold HoldL SaveI SaveE G FE L VI Tl VOld IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) ============================ <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) []
< search 6. Subgoal 1: Variables: V Hold HoldL SaveI SaveE G FE L VI Tl VOld IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL (consVal V Tl) LV
< EvMid_e: assert <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) []. Subgoal 1.2: Variables: V Hold HoldL SaveI SaveE G FE L VI Tl VOld IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] ============================ <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (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 VI Tl VOld IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL (consVal V Tl) LV
< EvAssign: assert exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G') [] /\ replaceScopes L (consVal V Tl) G G'. Subgoal 1.3: Variables: V Hold HoldL SaveI SaveE G FE L VI Tl VOld IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (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 VI Tl VOld IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] IsL : is_value (consVal VOld Tl) ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G') [] /\ replaceScopes L (consVal V Tl) G G'
< apply lookupScopes_is_key to _ LS. Subgoal 1.3: Variables: V Hold HoldL SaveI SaveE G FE L VI Tl VOld IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] IsL : is_value (consVal VOld Tl) H1 : is_string L ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (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 VI Tl VOld R IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] IsL : is_value (consVal VOld Tl) H1 : is_string L RS : replaceScopes L (consVal V Tl) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) R ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (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 VI Tl VOld I1 LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] IsL : is_value (consVal VOld Tl) H1 : is_string L RS : replaceScopes L (consVal V Tl) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((L, consVal V Tl)::LRemain)::G) RS1 : mem (L, I1) [(Hold, HoldL), (SaveI, VI), (SaveE, V)] RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L LRemain ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (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 VI Tl VOld LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes Hold ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name Hold))) (consVal V Tl) [] IsL : is_value (consVal VOld Tl) H1 : is_string Hold RS : replaceScopes Hold (consVal V Tl) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((Hold, consVal V Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (SaveE, V)] Hold LRemain ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign Hold (cons (name SaveE) (tail (name Hold)))) ([(Hold, HoldL), (SaveI, VI), (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 VI Tl VOld I1 LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] IsL : is_value (consVal VOld Tl) H1 : is_string L RS : replaceScopes L (consVal V Tl) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((L, consVal V Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L LRemain M : mem (L, I1) [(SaveI, VI), (SaveE, V)] ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (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 VI Tl VOld LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name SaveI))) (consVal V Tl) [] IsL : is_value (consVal VOld Tl) H1 : is_string SaveI RS : replaceScopes SaveI (consVal V Tl) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((SaveI, consVal V Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI LRemain ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign SaveI (cons (name SaveE) (tail (name SaveI)))) ([(Hold, HoldL), (SaveI, VI), (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 VI Tl VOld I1 LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] IsL : is_value (consVal VOld Tl) H1 : is_string L RS : replaceScopes L (consVal V Tl) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((L, consVal V Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L LRemain M : mem (L, I1) [(SaveE, V)] ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (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 VI Tl VOld LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes SaveE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name SaveE))) (consVal V Tl) [] IsL : is_value (consVal VOld Tl) H1 : is_string SaveE RS : replaceScopes SaveE (consVal V Tl) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((SaveE, consVal V Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveE LRemain ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign SaveE (cons (name SaveE) (tail (name SaveE)))) ([(Hold, HoldL), (SaveI, VI), (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 VI Tl VOld I1 LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] IsL : is_value (consVal VOld Tl) H1 : is_string L RS : replaceScopes L (consVal V Tl) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((L, consVal V Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L LRemain M : mem (L, I1) [] ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (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 VI Tl VOld New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] IsL : is_value (consVal VOld Tl) H1 : is_string L RS : replaceScopes L (consVal V Tl) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L RS2 : replaceScopes L (consVal V Tl) G New ============================ exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G') [] /\ replaceScopes L (consVal V Tl) G G'
< search. Subgoal 1: Variables: V Hold HoldL SaveI SaveE G FE L VI Tl VOld IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : exists G', <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G') [] /\ replaceScopes L (consVal V Tl) G G' ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto nilVal (consVal V Tl) LV
< exists G', consVal V Tl, VI. Subgoal 1.4: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ ((<evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] /\ matchInt VI 0) /\ 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 VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') []
< unfold . Subgoal 1.4.1: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ exists EE1 O1 O2, <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G') O2 /\ O1 ++ O2 = [])
< exists [(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G, [], []. Subgoal 1.4.1: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] /\ (<evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G') [] /\ [] ++ [] = [])
< split. Subgoal 1.4.1.1: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) []
< search. Subgoal 1.4.1.2: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G') []
< unfold . Subgoal 1.4.1.2: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ exists EE1 O1 O2, <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G') O2 /\ O1 ++ O2 = [])
< exists [(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G', [], []. Subgoal 1.4.1.2: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] /\ (<evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G') [] /\ [] ++ [] = [])
< split. Subgoal 1.4.1.2.1: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') []
< search. Subgoal 1.4.1.2.2: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G') []
< search 20. Subgoal 1.4.1.2.3: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (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 VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ [] ++ [] = []
< search. Subgoal 1.4.2: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ matchInt VI 0
< search. Subgoal 1.4.3: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ============================ replaceScopes L (consVal V Tl) G G'
< search. Subgoal 1.4.4: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, nilVal), (SaveI, VI), (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 VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto (consVal Hd Tl1) (consVal V Tl) LV
< LS': assert lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl). Subgoal 1.5.1: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 ============================ lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl)
< apply replaceScopes_lookupScopes_same to EvAssign1. Subgoal 1.5.1: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G') (consVal V Tl)
< search. Subgoal 1.5: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) Is : is_list (is_pair is_string is_value) [(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI), (SaveE, V)] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) Is3 : is_list (is_pair is_string is_value) [(SaveE, V)] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) Is3 : is_pair is_string is_value (SaveE, V) Is4 : is_list (is_pair is_string is_value) [] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) Is4 : is_list (is_pair is_string is_value) [] Is3 : is_string SaveE Is5 : is_value V ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto (consVal Hd Tl1) (consVal V Tl) LV
< apply lookupScopes_is_key to _ LS. Subgoal 1.5: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI Tl VOld G' Tl1 Hd IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G'1) [] EvLoop3 : replaceScopes L LV G' G'1 EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto (consVal Hd Tl1) (consVal V Tl) LV
< exists G'1, LV, VI. Subgoal 1.5: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G'1) [] /\ matchInt VI 0) /\ 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 VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::G'1) []
< unfold . Subgoal 1.5.2: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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, VI), (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, VI), (SaveE, V)]::G'1) O2 /\ O1 ++ O2 = [])
< exists [(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G, [], []. Subgoal 1.5.2: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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, VI), (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, VI), (SaveE, V)]::G) [] /\ (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G'1) [] /\ [] ++ [] = [])
< split. Subgoal 1.5.2.1: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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, VI), (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, VI), (SaveE, V)]::G) []
< search. Subgoal 1.5.2.2: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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, VI), (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, VI), (SaveE, V)]::G'1) []
< unfold . Subgoal 1.5.2.2: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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, VI), (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, VI), (SaveE, V)]::G'1) O2 /\ O1 ++ O2 = [])
< exists [(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G', [], []. Subgoal 1.5.2.2: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] /\ (<evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G'1) [] /\ [] ++ [] = [])
< split. Subgoal 1.5.2.2.1: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') []
< search. Subgoal 1.5.2.2.2: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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, VI), (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, VI), (SaveE, V)]::G'1) []
< search. Subgoal 1.5.2.2.3: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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 VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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 VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G'1) [] EvLoop3 : replaceScopes L LV G' G'1 EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV ============================ matchInt VI 0
< search. Subgoal 1.5.4: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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.4: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G'1) [] EvLoop3 : replaceScopes L LV G' G'1 EvLoop4 : flipOnto (consVal Hd Tl1) (consVal V Tl) LV H3 : replaceScopes L LV G G'1 ============================ replaceScopes L LV G G'1
< search. Subgoal 1.5.5: Variables: V Hold SaveI SaveE G FE L VI Tl VOld G' Tl1 Hd G'1 LV IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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) MI : matchInt VI 0 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, VI), (SaveE, V)]::G) (consVal VOld Tl) EvLoop1 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (SaveE, V)]::G) [] EvMid_e : <evalExpr {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (cons (name SaveE) (tail (name L))) (consVal V Tl) [] EvAssign : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] EvAssign1 : replaceScopes L (consVal V Tl) G G' ListyH' : listy Tl1 LS' : lookupScopes L ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') (consVal V Tl) IsL : is_value (consVal VOld Tl) 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, VI) 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, VI), (SaveE, V)]::G) (assign L (cons (name SaveE) (tail (name L)))) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') [] H1 : is_string L H2 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal Hd Tl1), (SaveI, VI), (SaveE, V)]::G') EvLoop2 : <evalStmt {P}> FE ([(Hold, consVal Hd Tl1), (SaveI, VI), (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, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal X Tl) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal X Tl) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL (consVal X TlNew) LV
< EvCond: assert <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []. Subgoal 2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal []
< unfold . Subgoal 2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal X Tl) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 ============================ exists V1 O1 V2 O2 I1 I2, <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (name SaveI) V1 O1 /\ (<evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (num 0) V2 O2 /\ (matchInt V1 I1 /\ (matchInt V2 I2 /\ (I1 > I2 /\ O1 ++ O2 = []))))
< exists VI, [], intVal 0, [], I, 0. Subgoal 2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (name SaveI) VI [] /\ (<evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (num 0) (intVal 0) [] /\ (matchInt VI I /\ (matchInt (intVal 0) 0 /\ (I > 0 /\ [] ++ [] = []))))
< split. Subgoal 2.1.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (name SaveI) VI []
< search. Subgoal 2.1.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (num 0) (intVal 0) []
< search. Subgoal 2.1.3: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal X Tl) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 ============================ matchInt VI I
< search. Subgoal 2.1.4: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (consVal X Tl) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 ============================ matchInt (intVal 0) 0
< search. Subgoal 2.1.5: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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.5: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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.5.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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.5.2: Variables: V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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.5.2: Variables: V Hold HoldL SaveI SaveE G FE L VI TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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.5.2: Variables: V Hold HoldL SaveI SaveE G FE L VI TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI 0 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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.6: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL (consVal X TlNew) LV
< EvBodyA: assert <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ exists V1, <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) V1 [] /\ replaceScopes SaveI V1 ([]::([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (minus (name SaveI) (num 1)) (intVal I1) [] /\ replaceScopes SaveI (intVal I1) ([]::([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ exists V1 O1 V2 O2 I2 I3, <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (name SaveI) V1 O1 /\ (<evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) V2 O2 /\ (matchInt V1 I2 /\ (matchInt V2 I3 /\ (I2 - I3 = I1 /\ O1 ++ O2 = []))))
< exists VI, [], intVal 1, [], I, 1. Subgoal 2.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (name SaveI) VI [] /\ (<evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal 1) [] /\ (matchInt VI I /\ (matchInt (intVal 1) 1 /\ (I - 1 = I1 /\ [] ++ [] = []))))
< split. Subgoal 2.2.1.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (name SaveI) VI []
< search. Subgoal 2.2.1.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ <evalExpr {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (num 1) (intVal 1) []
< search. Subgoal 2.2.1.3: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ matchInt VI I
< search. Subgoal 2.2.1.4: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ matchInt (intVal 1) 1
< search. Subgoal 2.2.1.5: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ I - 1 = I1
< search. Subgoal 2.2.1.6: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ [] ++ [] = []
< search. Subgoal 2.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ replaceScopes SaveI (intVal I1) ([]::([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ replaceScopes SaveI (intVal I1) ([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ exists I, mem (SaveI, I) [(Hold, HoldL), (SaveI, VI), (SaveE, V)] /\ remove_all [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI [(Hold, HoldL), (SaveE, V)]
< exists VI. Subgoal 2.2.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ mem (SaveI, VI) [(Hold, HoldL), (SaveI, VI), (SaveE, V)] /\ remove_all [(Hold, HoldL), (SaveI, VI), (SaveE, V)] SaveI [(Hold, HoldL), (SaveE, V)]
< split. Subgoal 2.2.2.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ mem (SaveI, VI) [(Hold, HoldL), (SaveI, VI), (SaveE, V)]
< search. Subgoal 2.2.2.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ remove_all [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(SaveI, HoldL), (SaveI, VI), (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, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] ============================ remove_all [(SaveI, VI), (SaveE, V)] SaveI [(SaveE, V)]
< unfold . Subgoal 2.2.2.2.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveI, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] LS : lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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) MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(L, consVal X Tl), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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, VI), (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.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 VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = L -> false NEqHL : Hold = L -> false NEqIE : L = SaveE -> false NEqIL : L = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false ListyH : listy HoldL MI : matchInt (consVal X Tl) I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (L, consVal X Tl), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (L, consVal X Tl), (SaveE, V)]::G) (greater (name L) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (L, consVal X Tl), (SaveE, V)]::G)) (assign L (minus (name L) (num 1))) ([]::([(L, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] L : Hold = L -> false ============================ <evalExpr {P}> FE ([]::([(L, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name L) (consVal X Tl) []
< apply NEqIL to _. Subgoal 2.3.1.1.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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.2.1: Variables: I Hold HoldL SaveI G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (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, VI), (L, consVal X Tl)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] LS : no_lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G)) (assign SaveI (minus (name SaveI) (num 1))) ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] LS : no_lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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)) []
< unfold . Subgoal 2.3: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <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.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (cons (head (name L)) (name Hold)) (consVal X HoldL) []
< unfold . Subgoal 2.3.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 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 recBuild (consRecFieldExprs "null" matchEval:host:false (consRecFieldExprs "head" (head (name L)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs))), recVal [("null", falseVal), ("head", X), ("tail", HoldL)], [], [], []. Subgoal 2.3.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ (<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) ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" (head (name L)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs))) /\ <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" (head (name L)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", X), ("tail", HoldL)]) [])
< split. Subgoal 2.3.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (head (name L)) X []
< search. Subgoal 2.3.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <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.2.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ lookupScopes Hold ([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G) HoldL
< unfold . Subgoal 2.3.2.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ lookup [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)] Hold HoldL
< unfold . Subgoal 2.3.2.2.1.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ SaveI = Hold -> false
< intros E. Subgoal 2.3.2.2.1.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] E : SaveI = Hold ============================ false
< case E. Subgoal 2.3.2.2.1.1: Variables: I V Hold HoldL SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (Hold, VI), (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, VI), (SaveE, V)]::G) (greater (name Hold) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (Hold, VI), (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) [] ============================ false
< backchain NEqHI. Subgoal 2.3.2.2.1.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ lookup [(Hold, HoldL), (SaveE, V)] Hold HoldL
< search. Subgoal 2.3.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 : 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.2.3: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ [] ++ [] = []
< search. Subgoal 2.3.2.4: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ |{expr}- cons (head (name L)) (name Hold) ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" (head (name L)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs)))
< search. Subgoal 2.3.2.5: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" (head (name L)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", X), ("tail", HoldL)]) []
< unfold . Subgoal 2.3.2.5: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalRecFields {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (consRecFieldExprs "null" false (consRecFieldExprs "head" (head (name L)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs))) [("null", falseVal), ("head", X), ("tail", HoldL)] []
< unfold . Subgoal 2.3.2.5: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 O1 O2, <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) false falseVal O1 /\ (<evalRecFields {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (consRecFieldExprs "head" (head (name L)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs)) [("head", X), ("tail", HoldL)] O2 /\ O1 ++ O2 = [])
< exists [], []. Subgoal 2.3.2.5: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) false falseVal [] /\ (<evalRecFields {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (consRecFieldExprs "head" (head (name L)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs)) [("head", X), ("tail", HoldL)] [] /\ [] ++ [] = [])
< split. Subgoal 2.3.2.5.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) false falseVal []
< search. Subgoal 2.3.2.5.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalRecFields {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (consRecFieldExprs "head" (head (name L)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs)) [("head", X), ("tail", HoldL)] []
< unfold . Subgoal 2.3.2.5.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 O1 O2, <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (head (name L)) X O1 /\ (<evalRecFields {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs) [("tail", HoldL)] O2 /\ O1 ++ O2 = [])
< exists [], []. Subgoal 2.3.2.5.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (head (name L)) X [] /\ (<evalRecFields {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs) [("tail", HoldL)] [] /\ [] ++ [] = [])
< split. Subgoal 2.3.2.5.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (head (name L)) X []
< search. Subgoal 2.3.2.5.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalRecFields {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (consRecFieldExprs "tail" (name Hold) nilRecFieldExprs) [("tail", HoldL)] []
< unfold . Subgoal 2.3.2.5.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 O1 O2, <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL O1 /\ (<evalRecFields {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) nilRecFieldExprs [] O2 /\ O1 ++ O2 = [])
< exists [], []. Subgoal 2.3.2.5.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalExpr {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (name Hold) HoldL [] /\ (<evalRecFields {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) nilRecFieldExprs [] [] /\ [] ++ [] = [])
< split. Subgoal 2.3.2.5.2.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <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.2.5.2.2.1.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ lookupScopes Hold ([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G) HoldL
< unfold . Subgoal 2.3.2.5.2.2.1.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ lookup [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)] Hold HoldL
< unfold . Subgoal 2.3.2.5.2.2.1.1.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ SaveI = Hold -> false
< intros E. Subgoal 2.3.2.5.2.2.1.1.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] E : SaveI = Hold ============================ false
< case E. Subgoal 2.3.2.5.2.2.1.1.1: Variables: I V Hold HoldL SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (Hold, VI), (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, VI), (SaveE, V)]::G) (greater (name Hold) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (Hold, VI), (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) [] ============================ false
< backchain NEqHI. Subgoal 2.3.2.5.2.2.1.1.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ lookup [(Hold, HoldL), (SaveE, V)] Hold HoldL
< search. Subgoal 2.3.2.5.2.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 : 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.2.5.2.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ <evalRecFields {P}> FE ([]::([(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) nilRecFieldExprs [] []
< search. Subgoal 2.3.2.5.2.2.3: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ [] ++ [] = []
< search. Subgoal 2.3.2.5.2.3: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ [] ++ [] = []
< search. Subgoal 2.3.2.5.3: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ [] ++ [] = []
< search. Subgoal 2.3.3: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ 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.3.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ no_lookup [] Hold
< search. Subgoal 2.3.3.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ 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.3.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 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.3.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ 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.3.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ mem (Hold, HoldL) [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)]
< search. Subgoal 2.3.3.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ remove_all [(SaveI, intVal I1), (Hold, HoldL), (SaveE, V)] Hold [(SaveI, intVal I1), (SaveE, V)]
< unfold . Subgoal 2.3.3.2.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ SaveI = Hold -> false
< intros E. Subgoal 2.3.3.2.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] E : SaveI = Hold ============================ false
< case E. Subgoal 2.3.3.2.2.1: Variables: I V Hold HoldL SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (Hold, VI), (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, VI), (SaveE, V)]::G) (greater (name Hold) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (Hold, VI), (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) [] ============================ false
< backchain NEqHI. Subgoal 2.3.3.2.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ remove_all [(Hold, HoldL), (SaveE, V)] Hold [(SaveE, V)]
< unfold . Subgoal 2.3.3.2.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ remove_all [(SaveE, V)] Hold [(SaveE, V)]
< unfold . Subgoal 2.3.3.2.2.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ SaveE = Hold -> false
< intros E. Subgoal 2.3.3.2.2.2.1: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] E : SaveE = Hold ============================ false
< case E. Subgoal 2.3.3.2.2.2.1: Variables: I V Hold HoldL SaveI G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (Hold, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (Hold, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ false
< backchain NEqHE. Subgoal 2.3.3.2.2.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) [] ============================ remove_all [] Hold []
< search. Subgoal 2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) ============================ 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'
< apply lookupScopes_is_key to _ LS. Subgoal 2.4: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : 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 VI I1 TlNew X Tl R IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl I2 LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((L, Tl)::LRemain)::G) RS1 : mem (L, I2) [(Hold, HoldL), (SaveI, VI), (SaveE, V)] RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes Hold ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string Hold RS : replaceScopes Hold Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((Hold, Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl I2 LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((L, Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L LRemain M : mem (L, I2) [(SaveI, VI), (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 VI I1 TlNew X Tl LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes SaveI ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string SaveI RS : replaceScopes SaveI Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((SaveI, Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl I2 LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((L, Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes SaveE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string SaveE RS : replaceScopes SaveE Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((SaveE, Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl I2 LRemain IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (((L, Tl)::LRemain)::G) RS2 : remove_all [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L RS2 : replaceScopes L Tl G New LS : lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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) MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(L, consVal X Tl), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(L, consVal X Tl), (SaveI, VI), (SaveE, V)]::G) ([(L, consVal X Tl), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(L, consVal X Tl), (SaveI, VI), (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 VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L RS2 : replaceScopes L Tl G New L : Hold = L -> false L1 : lookup [(SaveI, VI), (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.1: Variables: I V Hold HoldL SaveE G FE L I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV NEqHI : Hold = L -> false NEqHL : Hold = L -> false NEqIE : L = SaveE -> false NEqIL : L = L -> false NEqHE : Hold = SaveE -> false NEqEL : SaveE = L -> false ListyH : listy HoldL MI : matchInt (consVal X Tl) I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE Is+ : is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (L, consVal X Tl), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (L, consVal X Tl), (SaveE, V)]::G) (greater (name L) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (L, consVal X Tl), (SaveE, V)]::G)) (assign L (minus (name L) (num 1))) ([]::([(L, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) [] EvBodyB : <evalStmt {P}> FE ([]::([(L, intVal I1), (Hold, HoldL), (SaveE, V)]::G)) (assign Hold (cons (head (name L)) (name Hold))) ([]::([(Hold, consVal X HoldL), (L, intVal I1), (SaveE, V)]::G)) [] IsL : is_value (consVal X Tl) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (L, consVal X Tl), (SaveE, V)]::G) ([(Hold, HoldL), (L, consVal X Tl), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (L, consVal X Tl), (SaveE, V)] L RS2 : replaceScopes L Tl G New L : Hold = L -> false ============================ <evalExpr {P}> FE ([]::([(Hold, consVal X HoldL), (L, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl []
< apply NEqIL to _. Subgoal 2.4.2.1.1.1.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (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 []
< L: case L2. Subgoal 2.4.2.1.1.1.2.2.1: Variables: I Hold HoldL SaveI G FE L VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (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, VI), (L, consVal X Tl)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (L, consVal X Tl)]::G) ([(Hold, HoldL), (SaveI, VI), (L, consVal X Tl)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (L, consVal X Tl)] L RS2 : replaceScopes L Tl G New L : Hold = L -> false L1 : SaveI = L -> false ============================ <evalExpr {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (L, consVal X Tl)]::G)) (tail (name L)) Tl []
< apply NEqEL to _. Subgoal 2.4.2.1.1.1.2.2.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (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) ============================ <evalExpr {P}> FE ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G)) (tail (name L)) Tl []
< case L3. Subgoal 2.4.2.1.1.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * GEqI1 : I1 >= 0 EvCond : <evalExpr {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (SaveE, V)] L RS2 : replaceScopes L Tl G New LS : no_lookup [(Hold, HoldL), (SaveI, VI), (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 20. Subgoal 2.4.2.1.2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl New IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) H1 : is_string L RS : replaceScopes L Tl ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::New) RS1 : no_lookup [(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL (consVal X TlNew) LV
< EvBody: assert <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyA : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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, VI), (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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 IsFE : is_list (is_pair is_string (is_pair is_string (is_pair 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, VI), (SaveE, V)]::G) LS : lookupScopes L ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) Is : is_list (is_pair is_string is_value) [(Hold, HoldL), (SaveI, VI), (SaveE, V)] Is1 : is_list (is_list (is_pair is_string is_value)) G ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) Is1 : is_list (is_list (is_pair is_string is_value)) G Is : is_pair is_string is_value (Hold, HoldL) Is2 : is_list (is_pair is_string is_value) [(SaveI, VI), (SaveE, V)] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) Is1 : is_list (is_list (is_pair is_string is_value)) G Is2 : is_list (is_pair is_string is_value) [(SaveI, VI), (SaveE, V)] Is : is_string Hold Is3 : is_value HoldL ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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, VI) Is4 : is_list (is_pair is_string is_value) [(SaveE, V)] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI Is4 : is_pair is_string is_value (SaveE, V) Is6 : is_list (is_pair is_string is_value) [] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI Is6 : is_list (is_pair is_string is_value) [] Is4 : is_string SaveE Is7 : is_value V ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL (consVal X TlNew) LV
< apply matchInt_is to _ MI. Subgoal 2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL (consVal X TlNew) LV
< apply lookupScopes_is_key to _ LS. Subgoal 2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L ============================ is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G))
< search 6. Subgoal 2.6: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L ============================ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L IsG'+ : is_list (is_list (is_pair is_string is_value)) ([]::([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G')) ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : is_list (is_list (is_pair is_string is_value)) ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : 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 VI I1 TlNew X Tl G' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' G'1 LV VI' IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : 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, VI'), (SaveE, V)]::G'1) [] Sub1 : matchInt VI' 0 Sub2 : replaceScopes L LV G' G'1 Sub3 : flipOnto (consVal X HoldL) TlNew LV ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' G'1 LV VI' EE1 O1 O2 IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl Sub1 : matchInt VI' 0 Sub2 : replaceScopes L LV G' G'1 Sub3 : 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, VI'), (SaveE, V)]::G'1) O2 EvSub2 : O1 ++ O2 = [] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' G'1 LV VI' EE1 IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl Sub1 : matchInt VI' 0 Sub2 : replaceScopes L LV G' G'1 Sub3 : 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, VI'), (SaveE, V)]::G'1) [] ============================ exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL (consVal X TlNew) LV
< EvLoop1: assert <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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 VI I1 TlNew X Tl G' G'1 LV VI' EE1 IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl Sub1 : matchInt VI' 0 Sub2 : replaceScopes L LV G' G'1 Sub3 : 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, VI'), (SaveE, V)]::G'1) [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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 VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL (consVal X TlNew) LV
< exists G'1, LV, VI'. Subgoal 2: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl G' G'1 LV VI' EE1 IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl Sub1 : matchInt VI' 0 Sub2 : replaceScopes L LV G' G'1 Sub3 : 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, VI'), (SaveE, V)]::G'1) [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G'1) [] /\ matchInt VI' 0) /\ 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 VI I1 TlNew X Tl G' G'1 LV VI' EE1 IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl Sub1 : matchInt VI' 0 Sub2 : replaceScopes L LV G' G'1 Sub3 : 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, VI'), (SaveE, V)]::G'1) [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G'1) []
< search. Subgoal 2.9: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl G' G'1 LV VI' EE1 IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl Sub1 : matchInt VI' 0 Sub2 : replaceScopes L LV G' G'1 Sub3 : 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, VI'), (SaveE, V)]::G'1) [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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 [] ============================ matchInt VI' 0
< search. Subgoal 2.10: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl G' G'1 LV VI' EE1 IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl Sub1 : matchInt VI' 0 Sub2 : replaceScopes L LV G' G'1 Sub3 : 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, VI'), (SaveE, V)]::G'1) [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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 Sub2. Subgoal 2.10: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl G' G'1 LV VI' EE1 IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl Sub1 : matchInt VI' 0 Sub2 : replaceScopes L LV G' G'1 Sub3 : 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, VI'), (SaveE, V)]::G'1) [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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 [] H9 : replaceScopes L LV G G'1 ============================ replaceScopes L LV G G'1
< search. Subgoal 2.11: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl G' G'1 LV VI' EE1 IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl Sub1 : matchInt VI' 0 Sub2 : replaceScopes L LV G' G'1 Sub3 : 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, VI'), (SaveE, V)]::G'1) [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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 Sub3. Subgoal 2.11: Variables: I V Hold HoldL SaveI SaveE G FE L VI I1 TlNew X Tl G' G'1 LV VI' EE1 IH : forall OldL I V NewL Hold HoldL SaveI SaveE G FE L VI, 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 -> matchInt VI I -> I >= 0 -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) -> lookupScopes L ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) OldL -> exists G' LV VI', ((<evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (SaveE, V)]::G) (seq (while (greater (name SaveI) (num 0)) (seq (assign SaveI (minus (name SaveI) (num 1))) (seq (assign Hold (cons (head (name L)) (name Hold))) (assign L (tail (name L)))))) (seq (assign L (cons (name SaveE) (tail (name L)))) (while (not (null (name Hold))) (seq (assign L (cons (head (name Hold)) (name L))) (assign Hold (tail (name Hold))))))) ([(Hold, nilVal), (SaveI, VI'), (SaveE, V)]::G') [] /\ matchInt VI' 0) /\ replaceScopes L LV G G') /\ flipOnto HoldL NewL LV 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 MI : matchInt VI I GEqI0 : I >= 0 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, VI), (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, VI), (SaveE, V)]::G) (greater (name SaveI) (num 0)) trueVal [] EvBodyC1 : replaceScopes L Tl G G' EvBody : <evalStmt {P}> FE ([]::([(Hold, HoldL), (SaveI, VI), (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) 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 VI 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, VI), (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_string L H6 : is_list (is_pair is_string is_value) [] H7 : 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') H8 : lookupScopes L ([(Hold, consVal X HoldL), (SaveI, intVal I1), (SaveE, V)]::G') Tl Sub1 : matchInt VI' 0 Sub2 : 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, VI'), (SaveE, V)]::G'1) [] EvLoop1 : <evalStmt {P}> FE ([(Hold, HoldL), (SaveI, VI), (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 [] H9 : flipOnto HoldL (consVal X TlNew) LV ============================ flipOnto HoldL (consVal X TlNew) LV
< search. Proof completed.
< Prove_Constraint matchEval:host:proj_evalStmt_forward. 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 /\ scopes_same EE' EE''
< 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 /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 /\ scopes_same EE' EE''
< assert SaveE = L -> false. Subgoal 1.1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : O2 ++ O3 = O ============================ SaveE = L -> false
< intros E. Subgoal 1.1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : O2 ++ O3 = O E : SaveE = L ============================ false
< case E. Subgoal 1.1: Variables: Names FE EE EE' O Hold L SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 /\ scopes_same EE' EE''
< assert SaveI = L -> false. Subgoal 1.2: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 /\ scopes_same EE' EE''
< assert Hold = L -> false. Subgoal 1.3: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 /\ scopes_same EE' EE''
< assert Hold = SaveE -> false. Subgoal 1.4: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 /\ scopes_same EE' EE''
< assert Hold = SaveI -> false. Subgoal 1.5: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 /\ scopes_same EE' EE''
< NEqIE: assert SaveI = SaveE -> false. Subgoal 1.6: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 /\ scopes_same EE' EE''
< EvI: assert evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, VI)]::EE) O2. Subgoal 1.7: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2
< V: apply vars_exist to Is1. Subgoal 1.7: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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 VI O2 ============================ evalStmt FE ([]::EE) (declare intTy SaveI I) ([(SaveI, VI)]::EE) O2
< search. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::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 /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr1. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::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 /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ Ev1. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI ============================ 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 /\ scopes_same EE' EE''
< EvE: assert evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3. Subgoal 1.8: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI ============================ evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3
< V: apply vars_exist to Is2. Subgoal 1.8: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI V : vars E V1 ============================ evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3
< apply evalExpr_rel_exists to _ _ _ _ Ev3 V _ with EE_A = [(SaveI, VI)]::EE. Subgoal 1.8.1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI V : vars E V1 ============================ forall X XV, mem X V1 -> lookupScopes X EE XV -> lookupScopes X ([(SaveI, VI)]::EE) XV
< intros M L. Subgoal 1.8.1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV2 V1 X XV Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI V : vars E V1 M : mem X V1 L : lookupScopes X EE XV ============================ lookupScopes X ([(SaveI, VI)]::EE) XV
< MemN: apply lookupScopes_names to L Names. Subgoal 1.8.1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV2 V1 X XV Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI V : vars E V1 M : mem X V1 L : lookupScopes X EE XV MemN : mem X Names ============================ lookupScopes X ([(SaveI, VI)]::EE) XV
< assert SaveI = X -> false. Subgoal 1.8.1.1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV2 V1 X XV Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI V : vars E V1 M : mem X V1 L : lookupScopes X EE XV 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 VI O2 N V O3 LV2 V1 X XV Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI V : vars E V1 M : mem X V1 L : lookupScopes X EE XV 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 VI O2 N V O3 LV2 V1 X XV 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string X H7 : is_value VI V : vars E V1 M : mem X V1 L : lookupScopes X EE XV 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 VI O2 N V O3 LV2 V1 X XV Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI V : vars E V1 M : mem X V1 L : lookupScopes X EE XV MemN : mem X Names H8 : SaveI = X -> false ============================ lookupScopes X ([(SaveI, VI)]::EE) XV
< search. Subgoal 1.8: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI V : vars E V1 H8 : evalExpr FE ([(SaveI, VI)]::EE) E V O3 ============================ evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3
< search. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::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 /\ scopes_same EE' EE''
< apply fresh_name_is to _ Pr3. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::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 /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ Ev3. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::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 /\ scopes_same EE' EE''
< EvAI: assert evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) []. Subgoal 1.9: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V ============================ evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) []
< assert SaveE = SaveI -> false. Subgoal 1.9.1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveI E) ([(SaveI, V), (SaveI, VI)]::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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V H10 : SaveE = SaveI -> false ============================ evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) []
< search. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (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 /\ scopes_same EE' EE''
< EvH: assert evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (matchEval:list:nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) []. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (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 /\ scopes_same EE' EE''
< IsSaveI: apply fresh_name_is to _ Pr1. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (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 /\ scopes_same EE' EE''
< IsHold: apply fresh_name_is to _ Pr2. Subgoal 1.10: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (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 VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (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 /\ scopes_same EE' EE''
< GEq: apply updateListIndex_pos to Ev4. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (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 /\ scopes_same EE' EE''
< IsN: apply evalExpr_isValue to _ _ _ Ev1. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI ============================ 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 /\ scopes_same EE' EE''
< Main: apply proj_listUpdate_eval to _ _ _ _ _ _ _ _ _ _ _ _ _ with OldL = LV I = N V = V NewL = LV2 Hold = Hold VI = VI 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 VI O2 N V O3 LV2 G' LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE G' Main3 : 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 /\ scopes_same EE' EE''
< apply drop_proj_rel_evalStmt to Main. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV2 G' LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE G' Main3 : flipOnto nilVal LV2 LV1 H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (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 /\ scopes_same EE' EE''
< exists G'. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV2 G' LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE G' Main3 : flipOnto nilVal LV2 LV1 H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (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 /\ scopes_same EE' G'
< IsO3: apply evalExpr_isOutput to _ _ _ Ev3. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV2 G' LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE G' Main3 : flipOnto nilVal LV2 LV1 H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (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 /\ scopes_same EE' G'
< apply is_list_values_append_nil to IsO3. Subgoal 1: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV2 G' LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE G' Main3 : flipOnto nilVal LV2 LV1 H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (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 /\ scopes_same EE' G'
< split. Subgoal 1.11: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV2 G' LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE G' Main3 : flipOnto nilVal LV2 LV1 H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (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.12: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV2 G' LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV2 Ev5 : replaceScopes L LV2 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE G' Main3 : flipOnto nilVal LV2 LV1 H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] IsO3 : is_list is_value O3 H11 : O3 ++ [] = O3 ============================ scopes_same EE' G'
< case Main3. Subgoal 1.12: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 G' LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV1 Ev5 : replaceScopes L LV1 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE G' H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] IsO3 : is_list is_value O3 H11 : O3 ++ [] = O3 ============================ scopes_same EE' G'
< apply replaceScopes_unique to Main2 Ev5. Subgoal 1.12: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV1 Ev5 : replaceScopes L LV1 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::EE') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE EE' H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::EE') [] IsO3 : is_list is_value O3 H11 : O3 ++ [] = O3 ============================ scopes_same EE' EE'
< apply lookupScopes_is to _ Ev. Subgoal 1.12: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV1 Ev5 : replaceScopes L LV1 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::EE') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE EE' H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::EE') [] IsO3 : is_list is_value O3 H11 : O3 ++ [] = O3 H12 : is_value LV ============================ scopes_same EE' EE'
< apply evalExpr_isValue to _ _ _ Ev3. Subgoal 1.12: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV1 Ev5 : replaceScopes L LV1 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::EE') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE EE' H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::EE') [] IsO3 : is_list is_value O3 H11 : O3 ++ [] = O3 H12 : is_value LV H13 : is_value V ============================ scopes_same EE' EE'
< apply updateListIndex_is to _ _ Ev4. Subgoal 1.12: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV1 Ev5 : replaceScopes L LV1 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::EE') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE EE' H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::EE') [] IsO3 : is_list is_value O3 H11 : O3 ++ [] = O3 H12 : is_value LV H13 : is_value V H14 : is_value LV1 ============================ scopes_same EE' EE'
< apply replaceScopes_is to _ _ Main2. Subgoal 1.12: Variables: Names FE EE EE' O Hold L SaveE SaveI E I LV VI O2 N V O3 LV1 VI' Pr : Names |{stmt}- listUpdate L I E ~~> 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 VI O2 Ev2 : matchInt VI N Ev3 : evalExpr FE EE E V O3 Ev4 : updateListIndex LV N V LV1 Ev5 : replaceScopes L LV1 EE EE' Ev6 : 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, VI)]::EE) O2 H6 : is_string SaveI H7 : is_value VI EvE : evalStmt FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H8 : is_string SaveE H9 : is_value V EvAI : evalStmt FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : evalStmt FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] IsSaveI : is_string SaveI IsHold : is_string Hold GEq : N >= 0 IsN : is_value VI Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::EE') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE EE' H10 : evalStmt FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::EE') [] IsO3 : is_list is_value O3 H11 : O3 ++ [] = O3 H12 : is_value LV H13 : is_value V 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 Body SaveL X L Pr : Names |{stmt}- listForeach X L Body ~~> scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body)))) Names : names EE Names IsS : is_stmt (listForeach X L Body) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (listForeach X L Body) EE' O Pr1 : fresh_name "L" (X::Names) SaveL ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< Is: 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 Is : is_string X Is1 : is_expr L Is2 : is_stmt Body ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV 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 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 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< apply evalExpr_isValue to _ _ _ Ev. Subgoal 2: Variables: Names FE EE EE' O Body SaveL X L LV 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 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 H1 : is_value LV ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< EvW: 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 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 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 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< 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 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 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 ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< Ev': apply evalExpr_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 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 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 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 /\ scopes_same EE' EE''
< apply iterateList_isCtx to _ _ _ _ _ Ev1. 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 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 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 LV O2 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE'' O /\ scopes_same EE' EE''
< exists 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 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 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 LV O2 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ evalStmt FE EE (scopeStmt (seq (declare intTy SaveL L) (while (not (null (name SaveL))) (seq (declare intTy X (head (name SaveL))) (seq (assign SaveL (tail (name SaveL))) Body))))) EE' O /\ scopes_same EE' EE'
< split. Subgoal 2.1: 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 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 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 LV O2 H2 : is_list (is_list (is_pair is_string is_value)) 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. Subgoal 2.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 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 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 LV O2 H2 : is_list (is_list (is_pair is_string is_value)) EE' ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Proof completed.
< Prove_Ext_Ind matchEval:host:evalExpr, matchEval:host:evalArgs, matchEval:host:evalRecFields, matchEval: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.32: 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 []
< apply names_exists to IsEE. Subgoal 1.32: Variables: FE EE Ty 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 : <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) H1 : names EE N1 ============================ <evalExpr {P}> FE EE (nil Ty) nilVal []
< search. Subgoal 1.33: 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
< apply names_exists to IsEE. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 H1 : names EE N1 ============================ <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
< apply ext_size_is_int_evalExpr to R3. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 H1 : names EE N1 H2 : is_integer N2 ============================ <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
< apply ext_size_is_int_evalExpr to R4. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 H1 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 ============================ <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
< case IsE. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 ============================ <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
< apply plus_integer_is_integer to _ _ R2. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 ============================ <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
< L: apply lt_plus_one to R1 _. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N ============================ <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
< apply ext_size_pos_evalExpr to R3. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 ============================ <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
< apply ext_size_pos_evalExpr to R4. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 ============================ <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
< Acc: case Acc. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
< RP1: assert <evalExpr {P}> FE EE E1 V1 O2. Subgoal 1.33.1: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE E1 V1 O2
< Or: apply lt_left to R2 _ _. Subgoal 1.33.1: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * Or : N2 < N4 \/ N2 = N4 ============================ <evalExpr {P}> FE EE E1 V1 O2
< L': case Or. Subgoal 1.33.1.1: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * L' : N2 < N4 ============================ <evalExpr {P}> FE EE E1 V1 O2
< L'': apply less_integer_transitive to L' L. Subgoal 1.33.1.1: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * L' : N2 < N4 L'' : N2 < N ============================ <evalExpr {P}> FE EE E1 V1 O2
< A2: apply Acc to _ L''. Subgoal 1.33.1.1: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * L' : N2 < N4 L'' : N2 < N A2 : acc N2 * ============================ <evalExpr {P}> FE EE E1 V1 O2
< apply IH to R3 A2 _ _ _. Subgoal 1.33.1.1: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * L' : N2 < N4 L'' : N2 < N A2 : acc N2 * H9 : <evalExpr {P}> FE EE E1 V1 O2 ============================ <evalExpr {P}> FE EE E1 V1 O2
< search. Subgoal 1.33.1.2: Variables: N FE EE O N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N4 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N4 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE E1 V1 O2
< A2: apply Acc to _ L. Subgoal 1.33.1.2: Variables: N FE EE O N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N4 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N4 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N4 * ============================ <evalExpr {P}> FE EE E1 V1 O2
< apply IH to R3 A2 _ _ _. Subgoal 1.33.1.2: Variables: N FE EE O N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N4 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N4 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * A2 : acc N4 * H9 : <evalExpr {P}> FE EE E1 V1 O2 ============================ <evalExpr {P}> FE EE E1 V1 O2
< search. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 ============================ <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
< RP2: assert <evalExpr {P}> FE EE E2 V2 O3. Subgoal 1.33.2: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 ============================ <evalExpr {P}> FE EE E2 V2 O3
< Or: apply lt_right to R2 _ _ _. Subgoal 1.33.2: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 Or : N3 < N4 \/ N3 = N4 ============================ <evalExpr {P}> FE EE E2 V2 O3
< L': case Or. Subgoal 1.33.2.1: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 L' : N3 < N4 ============================ <evalExpr {P}> FE EE E2 V2 O3
< L'': apply less_integer_transitive to L' L. Subgoal 1.33.2.1: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 L' : N3 < N4 L'' : N3 < N ============================ <evalExpr {P}> FE EE E2 V2 O3
< A3: apply Acc to _ L''. Subgoal 1.33.2.1: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 L' : N3 < N4 L'' : N3 < N A3 : acc N3 * ============================ <evalExpr {P}> FE EE E2 V2 O3
< apply IH to R4 A3 _ _ _. Subgoal 1.33.2.1: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 L' : N3 < N4 L'' : N3 < N A3 : acc N3 * H9 : <evalExpr {P}> FE EE E2 V2 O3 ============================ <evalExpr {P}> FE EE E2 V2 O3
< search. Subgoal 1.33.2.2: Variables: N FE EE O N2 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N4 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N4 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 ============================ <evalExpr {P}> FE EE E2 V2 O3
< A3: apply Acc to _ L. Subgoal 1.33.2.2: Variables: N FE EE O N2 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N4 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N4 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 A3 : acc N4 * ============================ <evalExpr {P}> FE EE E2 V2 O3
< apply IH to R4 A3 _ _ _. Subgoal 1.33.2.2: Variables: N FE EE O N2 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N4 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N4 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 A3 : acc N4 * H9 : <evalExpr {P}> FE EE E2 V2 O3 ============================ <evalExpr {P}> FE EE E2 V2 O3
< search. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 ============================ <evalExpr {P}> FE EE (cons E1 E2) (consVal V1 V2) O
< unfold . Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 ============================ exists E_P V_P O_P O1 O2, (<evalExpr {P}> FE EE E1 V1 O1 /\ (<evalExpr {P}> FE EE E2 V2 O2 /\ O1 ++ O2 = O)) /\ (|{expr}- cons E1 E2 ~~> E_P /\ <evalExpr {P}> FE EE E_P V_P O_P)
< exists recBuild (consRecFieldExprs "null" matchEval:host:false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))), recVal [("null", falseVal), ("head", V1), ("tail", V2)], O, O2, O3. Subgoal 1.33: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 ============================ (<evalExpr {P}> FE EE E1 V1 O2 /\ (<evalExpr {P}> FE EE E2 V2 O3 /\ O2 ++ O3 = O)) /\ (|{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs))) /\ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) O)
< split. Subgoal 1.33.3: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 ============================ <evalExpr {P}> FE EE E1 V1 O2
< search. Subgoal 1.33.4: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 ============================ <evalExpr {P}> FE EE E2 V2 O3
< search. Subgoal 1.33.5: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 ============================ O2 ++ O3 = O
< search. Subgoal 1.33.6: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 ============================ |{expr}- cons E1 E2 ~~> recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))
< search. Subgoal 1.33.7: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) O
< Ev1: apply drop_ext_size_evalExpr to R3. Subgoal 1.33.7: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 Ev1 : evalExpr FE EE E1 V1 O2 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) O
< Ev2: apply drop_ext_size_evalExpr to R4. Subgoal 1.33.7: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 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 (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) O
< IsO2: apply evalExpr_isOutput to _ _ _ Ev1. Subgoal 1.33.7: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 Ev1 : evalExpr FE EE E1 V1 O2 Ev2 : evalExpr FE EE E2 V2 O3 IsO2 : is_list is_value O2 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) O
< IsO3: apply evalExpr_isOutput to _ _ _ Ev2. Subgoal 1.33.7: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 Ev1 : evalExpr FE EE E1 V1 O2 Ev2 : evalExpr FE EE E2 V2 O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) O
< apply is_list_values_append_nil to IsO2. Subgoal 1.33.7: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 Ev1 : evalExpr FE EE E1 V1 O2 Ev2 : evalExpr FE EE E2 V2 O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 H9 : O2 ++ [] = O2 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) O
< apply is_list_values_append_nil to IsO3. Subgoal 1.33.7: Variables: N FE EE O N2 N3 N4 O2 O3 V2 V1 E2 E1 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 : <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 : names EE N1 H2 : is_integer N2 H3 : is_integer N3 H4 : is_expr E1 H5 : is_expr E2 H6 : is_integer N4 L : N4 < N H7 : 0 <= N2 H8 : 0 <= N3 Acc : forall M, 0 <= M -> M < N -> acc M * RP1 : <evalExpr {P}> FE EE E1 V1 O2 RP2 : <evalExpr {P}> FE EE E2 V2 O3 Ev1 : evalExpr FE EE E1 V1 O2 Ev2 : evalExpr FE EE E2 V2 O3 IsO2 : is_list is_value O2 IsO3 : is_list is_value O3 H9 : O2 ++ [] = O2 H10 : O3 ++ [] = O3 ============================ <evalExpr {P}> FE EE (recBuild (consRecFieldExprs "null" false (consRecFieldExprs "head" E1 (consRecFieldExprs "tail" E2 nilRecFieldExprs)))) (recVal [("null", falseVal), ("head", V1), ("tail", V2)]) O
< search. Subgoal 1.34: 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
< apply ext_size_is_int_evalExpr to R2. Subgoal 1.34: 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 ** H1 : is_integer N2 ============================ <evalExpr {P}> FE EE (head E1) V O
< apply ext_size_pos_evalExpr to R2. Subgoal 1.34: 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 ** H1 : is_integer N2 H2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (head E1) V O
< case IsE. Subgoal 1.34: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 ============================ <evalExpr {P}> FE EE (head E1) V O
< Acc: case Acc. Subgoal 1.34: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (head E1) V O
< L: apply lt_plus_one to R1 _. Subgoal 1.34: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N ============================ <evalExpr {P}> FE EE (head E1) V O
< A: apply Acc to _ L. Subgoal 1.34: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * ============================ <evalExpr {P}> FE EE (head E1) V O
< apply IH to R2 A _ _ _. Subgoal 1.34: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal V Tl) O ============================ <evalExpr {P}> FE EE (head E1) V O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.34: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal V Tl) O Ev : evalExpr FE EE E1 (consVal V Tl) O ============================ <evalExpr {P}> FE EE (head E1) V O
< IsO: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 1.34: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal V Tl) O Ev : evalExpr FE EE E1 (consVal V Tl) O IsO : is_list is_value O ============================ <evalExpr {P}> FE EE (head E1) V O
< apply is_list_values_append_nil to IsO. Subgoal 1.34: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal V Tl) O Ev : evalExpr FE EE E1 (consVal V Tl) O IsO : is_list is_value O H5 : O ++ [] = O ============================ <evalExpr {P}> FE EE (head E1) V O
< search. Subgoal 1.35: 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
< apply ext_size_is_int_evalExpr to R2. Subgoal 1.35: 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 ** H1 : is_integer N2 ============================ <evalExpr {P}> FE EE (tail E1) V O
< apply ext_size_pos_evalExpr to R2. Subgoal 1.35: 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 ** H1 : is_integer N2 H2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (tail E1) V O
< case IsE. Subgoal 1.35: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 ============================ <evalExpr {P}> FE EE (tail E1) V O
< Acc: case Acc. Subgoal 1.35: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (tail E1) V O
< L: apply lt_plus_one to R1 _. Subgoal 1.35: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N ============================ <evalExpr {P}> FE EE (tail E1) V O
< A: apply Acc to _ L. Subgoal 1.35: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * ============================ <evalExpr {P}> FE EE (tail E1) V O
< apply IH to R2 A _ _ _. Subgoal 1.35: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal Hd V) O ============================ <evalExpr {P}> FE EE (tail E1) V O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.35: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal Hd V) O Ev : evalExpr FE EE E1 (consVal Hd V) O ============================ <evalExpr {P}> FE EE (tail E1) V O
< IsO: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 1.35: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal Hd V) O Ev : evalExpr FE EE E1 (consVal Hd V) O IsO : is_list is_value O ============================ <evalExpr {P}> FE EE (tail E1) V O
< apply is_list_values_append_nil to IsO. Subgoal 1.35: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal Hd V) O Ev : evalExpr FE EE E1 (consVal Hd V) O IsO : is_list is_value O H5 : O ++ [] = O ============================ <evalExpr {P}> FE EE (tail E1) V O
< search. Subgoal 1.36: 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
< apply ext_size_is_int_evalExpr to R2. Subgoal 1.36: 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 ** H1 : is_integer N2 ============================ <evalExpr {P}> FE EE (null E1) trueVal O
< apply ext_size_pos_evalExpr to R2. Subgoal 1.36: 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 ** H1 : is_integer N2 H2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (null E1) trueVal O
< case IsE. Subgoal 1.36: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 ============================ <evalExpr {P}> FE EE (null E1) trueVal O
< Acc: case Acc. Subgoal 1.36: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (null E1) trueVal O
< L: apply lt_plus_one to R1 _. Subgoal 1.36: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N ============================ <evalExpr {P}> FE EE (null E1) trueVal O
< A: apply Acc to _ L. Subgoal 1.36: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * ============================ <evalExpr {P}> FE EE (null E1) trueVal O
< apply IH to R2 A _ _ _. Subgoal 1.36: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 nilVal O ============================ <evalExpr {P}> FE EE (null E1) trueVal O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.36: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 nilVal O Ev : evalExpr FE EE E1 nilVal O ============================ <evalExpr {P}> FE EE (null E1) trueVal O
< IsO: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 1.36: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 nilVal O Ev : evalExpr FE EE E1 nilVal O IsO : is_list is_value O ============================ <evalExpr {P}> FE EE (null E1) trueVal O
< apply is_list_values_append_nil to IsO. Subgoal 1.36: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 nilVal O Ev : evalExpr FE EE E1 nilVal O IsO : is_list is_value O H5 : O ++ [] = O ============================ <evalExpr {P}> FE EE (null E1) trueVal O
< search. Subgoal 1.37: 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
< apply ext_size_is_int_evalExpr to R2. Subgoal 1.37: 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 ** H1 : is_integer N2 ============================ <evalExpr {P}> FE EE (null E1) falseVal O
< apply ext_size_pos_evalExpr to R2. Subgoal 1.37: 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 ** H1 : is_integer N2 H2 : 0 <= N2 ============================ <evalExpr {P}> FE EE (null E1) falseVal O
< case IsE. Subgoal 1.37: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 ============================ <evalExpr {P}> FE EE (null E1) falseVal O
< Acc: case Acc. Subgoal 1.37: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (null E1) falseVal O
< L: apply lt_plus_one to R1 _. Subgoal 1.37: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N ============================ <evalExpr {P}> FE EE (null E1) falseVal O
< A: apply Acc to _ L. Subgoal 1.37: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * ============================ <evalExpr {P}> FE EE (null E1) falseVal O
< apply IH to R2 A _ _ _. Subgoal 1.37: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal Hd Tl) O ============================ <evalExpr {P}> FE EE (null E1) falseVal O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 1.37: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal Hd Tl) O Ev : evalExpr FE EE E1 (consVal Hd Tl) O ============================ <evalExpr {P}> FE EE (null E1) falseVal O
< IsO: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 1.37: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal Hd Tl) O Ev : evalExpr FE EE E1 (consVal Hd Tl) O IsO : is_list is_value O ============================ <evalExpr {P}> FE EE (null E1) falseVal O
< apply is_list_values_append_nil to IsO. Subgoal 1.37: 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_integer N2 H2 : 0 <= N2 H3 : is_expr E1 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N A : acc N2 * H4 : <evalExpr {P}> FE EE E1 (consVal Hd Tl) O Ev : evalExpr FE EE E1 (consVal Hd Tl) O IsO : is_list is_value O H5 : O ++ [] = O ============================ <evalExpr {P}> FE EE (null E1) falseVal O
< search. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 R6. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 R6. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N4 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N4 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvE: apply IH to R6 A2 _ _ _. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvE': apply drop_ext_size_evalExpr to R6. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI ============================ <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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2. Subgoal 4.15.11: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2
< V: apply vars_exist to Is1. Subgoal 4.15.11: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N3 ============================ <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, VI)]::EE) O2
< apply IH to E A3 _ _ _. Subgoal 4.15.11: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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 VI O2 N3 H16 : <evalExpr {P}> FE ([]::EE) I VI O2 ============================ <evalStmt {P}> FE ([]::EE) (declare intTy SaveI I) ([(SaveI, VI)]::EE) O2
< search 10. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvE: assert <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3. Subgoal 4.15.12: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 ============================ <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3
< V: apply vars_exist to Is2. Subgoal 4.15.12: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 V : vars E V1 ============================ <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3
< E: apply evalExpr_rel_exists_ES to _ _ _ _ R6 V _ with EE_A = [(SaveI, VI)]::EE. Subgoal 4.15.12.1: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 V : vars E V1 ============================ forall X V2, mem X V1 -> lookupScopes X EE V2 -> lookupScopes X ([(SaveI, VI)]::EE) V2
< intros M L. Subgoal 4.15.12.1: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 V : vars E V1 M : mem X V1 L : lookupScopes X EE V2 ============================ lookupScopes X ([(SaveI, VI)]::EE) V2
< MemN: apply lookupScopes_names to L NamesEE. Subgoal 4.15.12.1: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 V : vars E V1 M : mem X V1 L : lookupScopes X EE V2 MemN : mem X Names ============================ lookupScopes X ([(SaveI, VI)]::EE) V2
< assert SaveI = X -> false. Subgoal 4.15.12.1.1: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::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 VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::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, VI)]::EE) V2
< search. Subgoal 4.15.12: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 V : vars E V1 E : <evalExpr {ES}> FE ([(SaveI, VI)]::EE) E V O3 N2 ============================ <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3
< apply IH to E A2 _ _ _. Subgoal 4.15.12: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 V : vars E V1 E : <evalExpr {ES}> FE ([(SaveI, VI)]::EE) E V O3 N2 H16 : <evalExpr {P}> FE ([(SaveI, VI)]::EE) E V O3 ============================ <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3
< search. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvAI: assert <evalStmt {P}> FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) []. Subgoal 4.15.13: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 ============================ <evalStmt {P}> FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) []
< assert SaveE = SaveI -> false. Subgoal 4.15.13.1: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 ============================ SaveE = SaveI -> false
< intros E. Subgoal 4.15.13.1: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 E : SaveE = SaveI ============================ false
< case E. Subgoal 4.15.13.1: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveI E) ([(SaveI, V), (SaveI, VI)]::EE) O3 ============================ false
< backchain NEqIE. Subgoal 4.15.13: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 H16 : SaveE = SaveI -> false ============================ <evalStmt {P}> FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) []
< search. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< EvH: assert <evalStmt {P}> FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (matchEval:list:nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) []. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : <evalStmt {P}> FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< GEq: apply updateListIndex_pos to R7. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : <evalStmt {P}> FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (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 VI = VI HoldL = nilVal SaveI = SaveI SaveE = SaveE G = EE L = L. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 V O3 LV2 E I L Names SaveI Hold SaveE G' LV1 VI' IH : forall N FE EE E V O, <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O IH1 : forall N FE EE A V O, <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O IH2 : forall N FE EE RF V O, <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : <evalStmt {P}> FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] GEq : N1 >= 0 Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE G' Main3 : 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 VI O2 N1 V O3 LV2 E I L Names SaveI Hold SaveE G' LV1 VI' IH : forall N FE EE E V O, <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O IH1 : forall N FE EE A V O, <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O IH2 : forall N FE EE RF V O, <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : <evalStmt {P}> FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] GEq : N1 >= 0 Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE G' Main3 : flipOnto nilVal LV2 LV1 IsO3 : is_list is_value O3 ============================ <evalStmt {P}> FE EE (listUpdate L I E) EE' O
< apply is_list_values_append_nil to IsO3. Subgoal 4.15: Variables: N FE EE EE' O N3 N2 N4 LV VI O2 N1 V O3 LV2 E I L Names SaveI Hold SaveE G' LV1 VI' IH : forall N FE EE E V O, <evalExpr {ES}> FE EE E V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V O IH1 : forall N FE EE A V O, <evalArgs {ES}> FE EE A V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V O IH2 : forall N FE EE RF V O, <evalRecFields {ES}> FE EE RF V O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE V X Body EE' O, <iterateList {ES}> FE EE V X Body EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_value V -> is_string X -> is_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 VI O2 N3 ** R5 : matchInt VI N1 R6 : <evalExpr {ES}> FE EE E V O3 N2 ** R7 : updateListIndex LV N1 V LV2 R8 : replaceScopes L LV2 EE EE' R9 : 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 VI O2 EvE : <evalExpr {P}> FE EE E V O3 EvI' : evalExpr FE EE I VI O2 EvE' : evalExpr FE EE E V O3 H6 : is_value VI 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, VI)]::EE) O2 EvE1 : <evalStmt {P}> FE ([(SaveI, VI)]::EE) (declare intTy SaveE E) ([(SaveE, V), (SaveI, VI)]::EE) O3 EvAI : <evalStmt {P}> FE ([(SaveE, V), (SaveI, VI)]::EE) (assign SaveI (name SaveI)) ([(SaveI, VI), (SaveE, V)]::EE) [] EvH : <evalStmt {P}> FE ([(SaveI, VI), (SaveE, V)]::EE) (declare intTy Hold (nil intTy)) ([(Hold, nilVal), (SaveI, VI), (SaveE, V)]::EE) [] GEq : N1 >= 0 Main : <evalStmt {P}> FE ([(Hold, nilVal), (SaveI, VI), (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, VI'), (SaveE, V)]::G') [] Main1 : matchInt VI' 0 Main2 : replaceScopes L LV1 EE G' Main3 : 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.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 ============================ <evalExpr {P}> FE ([(SaveL, consVal Hd Tl)]::EE) (not (null (name SaveL))) trueVal []
< 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 [] ============================ 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.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 [] ============================ <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.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)) [] ============================ X = SaveL -> false
< intros E. 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)) [] E : X = SaveL ============================ false
< case E. Subgoal 6.2.3: 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.4: 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.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 * ============================ newNameScopes [[(SaveL, Tl)]] Len ([(SaveL, Tl)]::EE) EE
< unfold . Subgoal 6.2.5: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 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.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 * ============================ ((((length EE Len /\ drop 1 ([(SaveL, Tl)]::EE) EE) /\ take 1 ([(SaveL, Tl)]::EE) [[(SaveL, Tl)]]) /\ names [[(SaveL, Tl)]] [SaveL]) /\ names EE Names) /\ (forall X, mem X [SaveL] -> mem X Names -> false)
< split. Subgoal 6.2.5.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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.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' ============================ <evalStmt {P}> FE ([(X, Hd)]::([(SaveL, Tl)]::EE)) Body EE_A' O2
< apply ext_size_is_int_evalStmt to IL2. 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' 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.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' 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.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' 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.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' 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.6.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.6.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.6.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.6.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.6.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.6.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.6.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.7: 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.7: 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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.7.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.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::Names) -> mem X1 (X::N4)
< 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::Names) ============================ mem X1 (X::N4)
< M: case M. Subgoal 6.2.8.1: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 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.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 Names ============================ mem X1 (X::N4)
< apply names_same_names to NS Names N M. Subgoal 6.2.8.2: Variables: FE SaveL EE X Body EE' O Names N N' N2 N3 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.9: 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.9: 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.9.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.9.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.9.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.9.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.10: 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.10: 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.10: 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.10.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.10.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.10.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.10.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.10.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.10.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.10.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.11: 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.11: 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 matchEval:host:paramName_unique. Proof completed.
< Prove_Constraint matchEval:host:proj_paramName_forward. Proof completed.
< Prove_Constraint matchEval:host:proj_paramName_back. Proof completed.
< Prove matchEval:host:getFunEvalInfo_unique. Proof completed.
< Prove_Constraint matchEval:host:proj_getFunEvalInfo_forward. Proof completed.
< Prove_Constraint matchEval:host:proj_getFunEvalInfo_back. Proof completed.
< Prove matchEval:host:evalProgram_unique. Proof completed.
< Prove_Constraint matchEval:host:proj_evalProgram_forward. Proof completed.
< Prove_Constraint matchEval:host:proj_evalProgram_back. Proof completed.
< Theorem updateListIndex_typePres : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out -> valueType Out (listTy Ty). ============================ forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out -> valueType Out (listTy Ty)
< induction on 3. IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) ============================ forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out @ -> valueType Out (listTy Ty)
< intros VTL VTV ULI. Variables: L Ty I V Out IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTL : valueType L (listTy Ty) VTV : valueType V Ty ULI : updateListIndex L I V Out @ ============================ valueType Out (listTy Ty)
< ULI: case ULI. Subgoal 1: Variables: Ty V Tl VOld IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTL : valueType (consVal VOld Tl) (listTy Ty) VTV : valueType V Ty ============================ valueType (consVal V Tl) (listTy Ty)
< VTL: case VTL. Subgoal 1: Variables: Ty V Tl VOld IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty VTL : valueType VOld Ty VTL1 : valueType Tl (listTy Ty) ============================ valueType (consVal V Tl) (listTy Ty)
< search. Subgoal 2: Variables: Ty I V I1 TlNew X Tl IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTL : valueType (consVal X Tl) (listTy Ty) VTV : valueType V Ty ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * ============================ valueType (consVal X TlNew) (listTy Ty)
< VTL: case VTL. Subgoal 2: Variables: Ty I V I1 TlNew X Tl IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * VTL : valueType X Ty VTL1 : valueType Tl (listTy Ty) ============================ valueType (consVal X TlNew) (listTy Ty)
< apply IH to _ _ ULI1. Subgoal 2: Variables: Ty I V I1 TlNew X Tl IH : forall L Ty I V Out, valueType L (listTy Ty) -> valueType V Ty -> updateListIndex L I V Out * -> valueType Out (listTy Ty) VTV : valueType V Ty ULI : I - 1 = I1 ULI1 : updateListIndex Tl I1 V TlNew * VTL : valueType X Ty VTL1 : valueType Tl (listTy Ty) H1 : valueType TlNew (listTy Ty) ============================ valueType (consVal X TlNew) (listTy Ty)
< search. Proof completed.
< Prove matchEval:host:matchRec_typePres. Subgoal 2: Variables: FTys IH : forall V Fs FTys, is_value V -> matchRec V Fs * -> valueType V (recTy FTys) -> valFieldTys Fs FTys IsV : is_value nilVal MR : matchRec nilVal [("null", trueVal)] @ VTy : valueType nilVal (recTy FTys) ============================ valFieldTys [("null", trueVal)] FTys
< case VTy. Subgoal 3: Variables: FTys V2 V1 IH : forall V Fs FTys, is_value V -> matchRec V Fs * -> valueType V (recTy FTys) -> valFieldTys Fs FTys IsV : is_value (consVal V1 V2) MR : matchRec (consVal V1 V2) [("null", falseVal), ("head", V1), ("tail", V2)] @ VTy : valueType (consVal V1 V2) (recTy FTys) ============================ valFieldTys [("null", falseVal), ("head", V1), ("tail", V2)] FTys
< case VTy. Proof completed.
< Prove matchEval:host:evalExpr_typePres, matchEval:host:evalStmt_typePres, matchEval:host:evalArgs_typePres, matchEval: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.32: 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.32: 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.33: 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.33: 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.33: 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 _ _ _ _ _ _ Ev1 _ _. Subgoal 1.33: 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 _ _ _ _ _ _ Ev2 _ _. Subgoal 1.33: 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.34: 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.34: 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.34: 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
< VT: apply IH_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.34: 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) VT : valueType (consVal V Tl) (listTy Ty) ============================ valueType V Ty
< VT: case VT. Subgoal 1.34: 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) VT : valueType V Ty VT1 : valueType Tl (listTy Ty) ============================ valueType V Ty
< search. Subgoal 1.35: 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.35: 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.35: 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)
< VT: apply IH_E to _ _ _ _ _ _ Ev1 _ _. Subgoal 1.35: 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) VT : valueType (consVal Hd V) (listTy Ty1) ============================ valueType V (listTy Ty1)
< VT: case VT. Subgoal 1.35: 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) VT : valueType Hd Ty1 VT1 : valueType V (listTy Ty1) ============================ valueType V (listTy Ty1)
< search. Subgoal 1.36: 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.36: 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.37: 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.37: 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 2.15: Variables: FT ET ET' FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : O2 ++ O3 = O ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 2.15: Variables: FT ET ET' FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 _ _ _ _ _ _ Ev4 _ _. Subgoal 2.15: Variables: FT ET' FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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'
< VTL: apply related_all_scopes_lookupScopes to Ctxs Ty Ev1. Subgoal 2.15: Variables: FT ET' FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 VTL : valueType LV (listTy Ty) ============================ related_all_scopes ET' EE'
< apply updateListIndex_typePres to VTL VT Ev5. Subgoal 2.15: Variables: FT ET' FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 VTL : valueType LV (listTy Ty) H4 : valueType LV2 (listTy Ty) ============================ related_all_scopes ET' EE'
< apply related_all_scopes_replaceScopes to _ _ _ Ev6 _ _. Subgoal 2.15: Variables: FT ET' FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 VTL : valueType LV (listTy Ty) H4 : valueType LV2 (listTy Ty) H5 : 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 matchEval:host:paramTy_paramName_same. Proof completed.
< Prove matchEval:host:funOK_getFunEvalInfo_related. Proof completed.
< Prove matchEval:host:evalExpr_output_forms, matchEval:host:evalStmt_output_forms, matchEval:host:evalArgs_output_forms, matchEval: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.32: 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.33: 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.33: 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.33: 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.33: 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.33: 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.34: 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.34: 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.34: 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.35: 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.35: 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.35: 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.36: 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.36: 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.36: 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.37: 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.37: 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.37: 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 2.15: Variables: FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : O2 ++ O3 = O ============================ output_forms O
< case IsS. Subgoal 2.15: Variables: FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 _ _ _ Ev4. Subgoal 2.15: Variables: FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 _ _ Ev7. Subgoal 2.15: Variables: FE EE EE' O LV VI O2 N 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 VI O2 * Ev3 : matchInt VI N Ev4 : evalExpr FE EE E V O3 * Ev5 : updateListIndex LV N V LV2 Ev6 : replaceScopes L LV2 EE EE' Ev7 : 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 matchEval:host:evalProgram_output_forms. Proof completed.
< Prove matchEval:host:paramName_exists. Proof completed.
< Prove matchEval:host:getFunEvalInfo_exists. Proof completed.